我有一张员工表。每个员工行都包含员工的经理。一名经理将拥有一名或多名员工,一名员工也可能是一名经理。
我正在尝试构建一个将返回给定经理的所有员工的查询。
例如,经理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')
答案 0 :(得分:0)
递归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