级联 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
我有 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