Bri*_* P. 5 sql-server select cascade
我有一张员工表。每个员工行包含员工的经理。一名经理将拥有一名或多名员工,一名员工也可能是一名经理。
我正在尝试构建一个查询,该查询将返回给定经理的所有员工。
例如,经理 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。
基本上,查询需要继续其级联,直到返回与所选经理有任何联系的所有员工。
我可以通过以下方式获得一级迭代:
select fullname from employees where manager = 'XXX'
or manager in (select fullname from employees where manager='XXXX')
Run Code Online (Sandbox Code Playgroud)
递归 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
Run Code Online (Sandbox Code Playgroud)
输出B:
Employee Manager
-------- -------
E B
F B
G B
Y E
Z E
Run Code Online (Sandbox Code Playgroud)
输出A:
Employee Manager
-------- -------
B A
C A
D A
H C
I C
E B
F B
G B
Y E
Z E
Run Code Online (Sandbox Code Playgroud)