级联 SQL select

Cascading SQL select

我有 table 名员工。每个员工行都包含员工的经理。一名经理将拥有一名或多名员工,一名员工也可能是一名经理。

我正在尝试构建一个查询,该查询将 return 给定经理的所有员工。

例如,经理A有员工B、C、D。员工B是E、F、G的经理。员工C是H、I的经理。D没有直接下属。 E 有 Y 和 Z 作为直接下属。

因此,如果我查询 A,我希望得到 B、C、D、E、F、G、H、Y 和 Z 作为结果。如果我在 B 上查询,我应该得到 E、F、G、Y 和 Z。

基本上,查询需要继续其级联,直到所有与所选经理有任何联系的员工都被 returned。

我可以通过以下方式获得一级迭代:

select fullname from employees where manager = 'XXX' 
or manager in (select fullname from employees where manager='XXXX')

递归 CTE 将帮助您:

DECLARE @m nvarchar(1) = 'B'
;WITH Employee AS (
SELECT *
FROM (VALUES
('A',NULL),
('B','A'),
('C','A'),
('D','A'),
('E','B'),
('F','B'),
('G','B'),
('H','C'),
('I','C'),
('Y','E'),
('Z','E')
) as t(Employee, Manager)
), cte AS (
SELECT *
FROM Employee
WHERE Manager = @m
UNION ALL
SELECT e.*
FROM cte c
INNER JOIN Employee e
ON e.Manager = c.Employee
)

SELECT *
FROM cte

B 的输出:

Employee Manager
-------- -------
E        B
F        B
G        B
Y        E
Z        E

A 的输出:

Employee Manager
-------- -------
B        A
C        A
D        A
H        C
I        C
E        B
F        B
G        B
Y        E
Z        E