首页 > 解决方案 > 使用 CTE 获取 emp 的层次结构,无论职位如何

问题描述

我正在研究使用 CTE 创建层次结构查询。但是,我在 where 子句中遗漏了一些东西,查询应该返回员工的完整层次结构

这是我创建的一个 SQL 小提琴。

预期成绩:

因为id = 3我应该得到这些结果:

ParentEmpId Id          Name 
----------- ----------- -----
NULL        1           A    
1           3           C    
3           6           F     

对于id = 2,我应该得到这些结果:

ParentEmpId Id          Name 
----------- ----------- -----
NULL        1           A    
1           2           B    
2           4           D     
2           5           E     

标签: sqlsql-server

解决方案


从您的预期输出来看,您似乎需要一个id. 因此,您需要一种用于孩子的层次结构和一种用于父母的层次结构:

WITH EmpCTE(ParentEmpId, Id, [Name], [Level]) AS
(
    SELECT ParentEmpId, Id, [Name], 0 AS [Level]
    FROM emp
    WHERE id=3
         UNION ALL
    SELECT E.ParentEmpId, E.Id, E.[Name], [Level] + 1
    FROM emp E
        INNER JOIN EmpCTE empCTE
        ON E.Id = EmpCTE.ParentEmpId 
),
 EmpCTE2(ParentEmpId, Id, [Name], [Level]) AS
(
    SELECT ParentEmpId, Id, [Name], 0 AS [Level]
    FROM emp
    WHERE id=3
         UNION ALL
    SELECT E.ParentEmpId, E.Id, E.[Name], [Level] + 1
    FROM emp E
        INNER JOIN EmpCTE2 empCTE2
        ON E.ParentEmpId = EmpCTE2.Id 
)
Select * from (
select * from EmpCTE 
Union 
select * from EmpCTE2 ) a
order by name

推荐阅读