2016-01-30 35 views
3

我需要查詢以從一個特定經理開始一直向下顯示下屬。比方說,我有這樣的結構,我需要得到所有員工經理ID = 1如何找到每個經理下的所有員工

EmployeeId ManagerId 
2   1 
3   1 
4   3 
5   3 
6   4 

Here I have the visualization

我需要得到作爲查詢的結果開始在他的經理ID和直接報告的員工,隨着他們的下屬。

例如,使用SQL Server 2014:

CREATE TABLE #Pepe (EmployeeId INT, ManagerId int) 

INSERT INTO [#Pepe] ([EmployeeId], [ManagerId]) VALUES (2, 1) 
INSERT INTO [#Pepe] ([EmployeeId], [ManagerId]) VALUES (3, 1) 
INSERT INTO [#Pepe] ([EmployeeId], [ManagerId]) VALUES (4, 3) 
INSERT INTO [#Pepe] ([EmployeeId], [ManagerId]) VALUES (5, 3) 
INSERT INTO [#Pepe] ([EmployeeId], [ManagerId]) VALUES (6, 4) 

現在我得到的CTE

;WITH relation AS 
    (
     SELECT 1 as EmployeeId, 0 AS LEVEL 

     UNION ALL 

     SELECT r.EmployeeId, LEVEL + 1 AS LEVEL 
     FROM (SELECT EmployeeId, ManagerId FROM #Pepe) r 
     INNER JOIN relation T 
      ON r.ManagerId = T.EmployeeId 
     WHERE r.ManagerId <> r.EmployeeId 

    ) 

SELECT DISTINCT EmployeeId, LEVEL FROM relation 

我CTE的結果是這樣的:從

EmployeeId LEVEL 
1   0 
2   1 
3   1 
4   2 
5   2 
6   3 

這個結果開始一個特定的員工是1(在CTE上進行了硬編碼),現在我只需要直接報告,Level = 1以及0級的直接報告EE ID 1,2和3

這是好的,現在我需要的是對每個員工的ID(0級和1),我需要得到這樣的結果:

EmployeeId ManagerId 
1   1 
2   1 
3   1 
4   1 
5   1 
6   1 
2   2 
3   3 
4   3 
5   3 
6   3 

正如你所看到的管理員ID包含0級和1級的員工,對於每個員工,我基本上都會調用CTE來讓所有員工失效,例如ManagerId = 2沒有下屬,但無論如何我都要計算它。有沒有一種有效的方法來做到這一點?我正在使用交叉應用程序將CTE放入內聯函數中,但我遇到了性能問題。

+0

我不完全理解第二個數據集的要求是什麼。是否試圖找到每個員工最終報告的級別爲0或1的所有員工(包括員工本身是0級還是1級時)? –

回答

0

我想我找到了一個解決方案,我想對此有一個看法。

;WITH relation AS 
    (
     SELECT 1 AS ManagerId, 1 as EmployeeId, 0 AS LEVEL UNION  
     SELECT 2 AS ManagerId, 2 as EmployeeId, 0 AS LEVEL UNION 
     SELECT 3 AS ManagerId, 3 as EmployeeId, 0 AS LEVEL 

     UNION ALL 

     SELECT t.[ManagerId], r.EmployeeId, LEVEL + 1 AS LEVEL 
     FROM (SELECT EmployeeId, ManagerId FROM #Pepe) r 
     INNER JOIN relation T 
      ON r.ManagerId = T.EmployeeId 
     WHERE r.ManagerId <> r.EmployeeId 

    ) 

SELECT DISTINCT EmployeeId, [ManagerId] FROM relation ORDER BY 2 
相關問題