从一个表中获取组织级层次结构的Sql查询
我有一个名为employee的表。请参考下表,我想知道员工向哪个经理汇报的级别。我不知道逻辑是什么。我已经使用了CTE,但是我没有得到预期的结果。在这种情况下,请帮助我获得预期的结果 表雇员从一个表中获取组织级层次结构的Sql查询,sql,Sql,我有一个名为employee的表。请参考下表,我想知道员工向哪个经理汇报的级别。我不知道逻辑是什么。我已经使用了CTE,但是我没有得到预期的结果。在这种情况下,请帮助我获得预期的结果 表雇员 EmpID. EmpName. ManagerID 1 A Null 2
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
递归CTE在Postgresql中工作 一旦你得到了每个员工的所有级别,那么就可以将其分组以获得最高级别
WITH RECURSIVE RCTE AS
(
SELECT
EmpID AS BaseEmpID,
ManagerID AS BaseManagerID,
1 AS Lvl,
EmpID,
ManagerID
FROM employee
UNION ALL
SELECT
c.BaseEmpID,
c.BaseManagerID,
Lvl + 1,
m.EmpID,
m.ManagerID
FROM RCTE c
JOIN employee m
ON m.EmpID = c.ManagerID
)
, EMPLEVELS AS
(
SELECT
BaseEmpID,
BaseManagerID,
MAX(Lvl) AS Level
FROM RCTE
GROUP BY BaseEmpID, BaseManagerID
)
SELECT
e.EmpName,
m.EmpName AS ManagerName,
elvl.Level
FROM EMPLEVELS elvl
JOIN employee e ON e.EmpID = elvl.BaseEmpID
LEFT JOIN employee m ON m.EmpID = elvl.BaseManagerID
ORDER BY elvl.BaseEmpID;
返回:
empname managername level
A NULL 1
B A 2
C A 2
D B 3
E C 3
F D 4
G E 4
H E 4
如果删除了递归词,则在MS Sql Server中也可以使用相同的查询 我想你想要一个简单的
加入
:
select e.name, em.name as manager_name
from employees e left join
employees em
on e.managerId = em.empId;
你用的是什么产品?“SQL”只是一种查询语言,而不是特定数据库产品的名称。请为您正在使用的数据库产品添加标签,
postgresql
,oracle
,db2
,sql server
,…您不需要cte。通过manager I'd将表连接到自身,第二个表将包含经理名称。感谢rad为您提供宝贵的时间和清晰的解决方案,是的,此查询工作正常。。