2016-06-09 18 views
3

Ich habe eine Tabelle von Mitarbeitern. Jede Mitarbeiterzeile enthält den Manager des Mitarbeiters. Ein Manager wird einen oder mehrere Mitarbeiter haben und ein Mitarbeiter kann auch ein Manager sein.Cascading SQL wählen

Ich versuche, eine Abfrage zu erstellen, die alle Mitarbeiter eines bestimmten Managers zurückgibt.

Zum Beispiel hat Manager A Mitarbeiter B, C und D. Mitarbeiter B ist ein Manager von E, F und G. Mitarbeiter C ist ein Manager von H und ich. D hat keine direkten Berichte. E hat Y und Z als direkte Berichte.

Also, wenn ich auf A abgefragt würde, würde ich erwarten, B, C, D, E, F, G, H, Y und Z als Ergebnis zu erhalten. Wenn ich auf B abgefragt habe, sollte ich E, F, G, Y und Z bekommen.

Grundsätzlich muss die Abfrage seine Kaskade fortsetzen, bis alle Mitarbeiter mit irgendeiner Verbindung zu dem ausgewählten Manager zurückgegeben werden.

Ich kann eine Ebene der Iteration über erhalten:

select fullname from employees where manager = 'XXX' 
or manager in (select fullname from employees where manager='XXXX') 
+9

Klingt, als ob Sie in einem rekursiven CTE suchen sollten (https://technet.microsoft.com/en-us/library/ms186243 (v = sql.105) .aspx) wenn Ihre MSSQL-Version erlaubt es. – Conduit

+0

Dies kann auch helfen: http://StackOverflow.com/Questions/14274942/SQL-Server-Cte-and-Recursion-Beispiel – Alex

Antwort

0

rekursive CTE wird Ihnen helfen:

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 

Ausgang für B:

Employee Manager 
-------- ------- 
E  B 
F  B 
G  B 
Y  E 
Z  E 

Ausgang für A:

Employee Manager 
-------- ------- 
B  A 
C  A 
D  A 
H  C 
I  C 
E  B 
F  B 
G  B 
Y  E 
Z  E 
+0

Awesome! Danke für die Hilfe und die Links! –