Sql 管理器管理的经典自联接表

Sql 管理器管理的经典自联接表,sql,sql-server-2008-r2,self-join,Sql,Sql Server 2008 R2,Self Join,有没有一种方法可以通过一条SQL语句到达层次结构的根 该表的重要列将是:EMP_ID、MANAGER_ID 经理ID与EMP ID自联接,因为经理也是员工。给定一个EMP_ID,有没有办法找到EMP_ID为空的员工(经理)(走在链的上游) 换句话说,组织中的头号人物 我正在使用SQLServer2008 谢谢。很难找到一个SQL查询,它将使用表的当前结构生成结果。正如Brett所说,您可以尝试使用存储函数 但我认为最值得一看的是,这是一个在关系数据库中实现的树的确认设计。除此之外,它们还可以像您

有没有一种方法可以通过一条SQL语句到达层次结构的根

该表的重要列将是:EMP_ID、MANAGER_ID

经理ID与EMP ID自联接,因为经理也是员工。给定一个EMP_ID,有没有办法找到EMP_ID为空的员工(经理)(走在链的上游)

换句话说,组织中的头号人物

我正在使用SQLServer2008


谢谢。

很难找到一个SQL查询,它将使用表的当前结构生成结果。正如Brett所说,您可以尝试使用存储函数


但我认为最值得一看的是,这是一个在关系数据库中实现的树的确认设计。除此之外,它们还可以像您所寻找的那样进行递归查询

这是一个老问题,但我最近不得不做同样的事情,所以我想为这个问题给出一个CTE表达式的示例:

假设有一张桌子:

EMP_ID MANAGER_ID  
1 NULL  
2 1  
3 NULL  
4 2  
5 3  
6 5  
7 3  
CTE expresion首先查找经理ID为空的根级别,然后与其他员工通过简单的根级别内部联接完成

WITH PARENT
AS (
SELECT EMP_ID,
      MANAGER_ID,
      EMP_ID as BOSS
FROM tab
WHERE MANAGER_ID IS NULL
UNION ALL
SELECT T.EMP_ID,
       T.MANAGER_ID,
       PARENT.BOSS
FROM PARENT
    INNER JOIN TAB T ON T.MANAGER_ID = PARENT.EMP_ID)
SELECT *
FROM parent;
其结果是:

EMP_ID MANAGER_ID BOSS
1 NULL 1
3 NULL 3
5 3 3
7 3 3
6 5 3
2 1 1
4 2 1

我想这里有一棵不平衡的树。我的建议是实现一个功能管理器(emp_id),它将完全向上延伸。这样,您就可以
从表中选择emp\u id,manager(emp\u id)
。您可能需要阅读以下问答:“很难找到一个SQL查询,它将使用当前结构生成结果”。不,不是。请参见此问题(和答案),例如: