sql - 使用 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
解决方案
从您的预期输出来看,您似乎需要一个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
推荐阅读
- sql - 如何从同一个表中选择值,比较每一行的值?
- r - 将数据框中的缺失值与另一个值匹配
- nginx - 为特定文件夹下的页面增加 fastcgi_read_timeout
- spring-boot - 如何使 mockmvc 与不同的执行器端口一起工作?
- flutter - 在有状态的小部件中使用 Provider
- c# - 将货币字符串转换为数组和总计
- amazon-web-services - Nginx plus 作为 AWS ECS Fargate 实例的负载均衡器
- c# - 如何在没有 (409) 冲突的情况下附加到 Azure 存储帐户 (Gen2) AppendBlob
- c# - 执行线程时触发按钮单击事件
- django - 如何在 Django Admin 中创建一个显示图像的下拉菜单?