Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从一个表中获取组织级层次结构的Sql查询_Sql - Fatal编程技术网

从一个表中获取组织级层次结构的Sql查询

从一个表中获取组织级层次结构的Sql查询,sql,Sql,我有一个名为employee的表。请参考下表,我想知道员工向哪个经理汇报的级别。我不知道逻辑是什么。我已经使用了CTE,但是我没有得到预期的结果。在这种情况下,请帮助我获得预期的结果 表雇员 EmpID. EmpName. ManagerID 1 A Null 2

我有一个名为employee的表。请参考下表,我想知道员工向哪个经理汇报的级别。我不知道逻辑是什么。我已经使用了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

递归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为您提供宝贵的时间和清晰的解决方案,是的,此查询工作正常。。