Manager-Managed经典自联接表

时间:2013-11-15 14:48:35

标签: sql sql-server-2008-r2 self-join

有没有办法通过单个SQL语句到达层次结构的根目录?

该表的重要列将是:EMP_ID,MANAGER_ID。

MANAGER_ID自我加入EMP_ID,因为经理也是员工。给定EMP_ID是否有办法到达EMP_ID为空的员工(经理)(走上链)?

换句话说,组织中的顶级人物?

我正在使用SQL Server 2008

感谢。

3 个答案:

答案 0 :(得分:0)

很难找到一个SQL查询,它会将结果与您对表的当前结构结合起来。像布雷特说的那样,你可以尝试使用存储功能。

但我认为最值得关注的是nested sets,这是在关系数据库中实现的树的一个经过充分确认的设计。

答案 1 :(得分:0)

你想要一个Common Table Expression。除此之外,他们可以像您正在寻找的那样进行递归查询。

答案 2 :(得分:0)

这是一个老问题,但我最近做了同样的事情,所以我想举一个关于这个问题的CTE表达的例子:

假设有一张桌子:

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

CTE expresion开始于查找已经填充了空值的MANAGER_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