级联SQL选择

时间:2016-06-09 19:50:39

标签: 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')

1 个答案:

答案 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