2016-06-09 61 views
3

我有一張僱員表。每個員工行都包含員工的經理。一個經理將有一個或多個員工,一個員工也可能是一個經理。級聯SQL select

我想構建一個查詢,將返回給定的經理的所有僱員。

例如,經理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') 
+9

聽起來像你可能想使用[遞歸CTE](https://technet.microsoft.com/en-us/library/ms186243(v=sql.105).aspx)看看如果您的MSSQL版本允許它。 – Conduit

+0

這也可以幫助:http://stackoverflow.com/questions/14274942/sql-server-cte-and-recursion-example – Alex

回答

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 
+0

太棒了!感謝您的幫助和鏈接! –