sql - Sql 查询从一张表中获取组织级别层次结构
问题描述
我有一张名为员工的表。请参考下表,我想要员工向哪个经理报告的级别。我不知道会是什么逻辑。我使用了 CTE,但没有得到预期的结果。在这种情况下,请帮助我获得预期的结果。
表员工
EmpID. EmpName. ManagerID
1 A Null
2 B 1
3 C 1
4 D 2
5 E 3
6 F 4
7 G 5
8 H 5
预期结果
EmpName. ManagerName Level
A Null 1
B A 2
C A 2
D B 3
E C 4
F D 5
G E 6
H E 6
解决方案
假设您正在使用Sql Server
,您可以使用以下代码进行操作:
WITH cte (EmpId, EmpName, ManagerName, LEVEL) AS (
SELECT EmpId, EmpName, CAST('' AS VARCHAR) as ManagerName, 1 AS LEVEL
FROM Employee
WHERE ManagerId IS NULL
UNION ALL
SELECT e1.EmpId, e1.EmpName, CAST(cte.EmpName AS VARCHAR) ManagerName, (cte.LEVEL + 1) AS LEVEL
FROM Employee e1
JOIN cte ON e1.ManagerId = cte.EmpId
)
SELECT EmpName, ManagerName, LEVEL FROM cte
ORDER BY EmpName
请注意,您需要修改预期输出中的级别。例如,对于员工H
,层次结构是H => E => C => A
表明它的级别是4
。正确的级别如下:
EmpName ManagerName Level
A 1
B A 2
C A 2
D B 3
E C 3
F D 4
G E 4
H E 4
推荐阅读
- flutter - 相机插件flutter web
- python - 通过操作系统将火车数据移动到硬盘中的验证文件夹中
- python - 为什么我的 TensorFlow 模型停止训练
- python - 为什么从最近的教程中 100% 复制代码时 python Kivy Boxlayout 不显示?
- r - 如何在不在 R 中创建循环的情况下更改每行矩阵的列元素
- html - 尝试将样式应用于链接到在纯 html/css 中使用 :target 的元素的父 div
- sql - SQL:添加一列显示无效年龄的总数
- r - 您如何根据每行的唯一子集的函数定义列?
- python-3.x - 朴素字符串匹配算法的性能
- sql - Postgres 如果不存在则插入多行,如果存在或插入则返回所有 id,然后使用所有 id 插入另一个表