2016-05-24 118 views
1

試圖做一個遞歸CTE來顯示我下面的表格中的組織結構層次結構,有點難以置信,希望得到幫助。CTE顯示組織層次結構?

DECLARE @Org TABLE(
    EmployeeID smallint NOT NULL 
    ,ManagerID smallint NULL 
    ,LoginName varchar(50) 
); 

INSERT @Org 
VALUES (1,null,'Peter'),(2,1,'Larry'),(3,1,'John'), 
     (4,1,'Lisa'), (5,2,'Linda'),(6,3,'Nathan'), 
     (7,3,'Tom') , (8,3,'Terry'),(9,4,'Lou'), 
     (10,7,'David'), (11,9,'Ken') ,(12,9,'Robert'); 

試圖讓它看起來像

EmployeeID LoginName ManagerID LEVEL 
    1   Peter  NULL 0 
    2   Larry  1  1 
    3   John  1  1 
    4   Lisa  1  1 
    9   Lou   4  2 
    6   Nathan  3  2 
    7   Tom   3  2 
    8   Terry  3  2 
    5   Linda  2  2 
    10   David  7  3 
    11   Ken   9  3 
    12   Robert  9  3 
+0

釷是不是CTE。有更多的代碼可以看嗎?你只是想@Org輸出像你的表格示例? 「Level」來自哪裏? –

+0

所以這裏有'SELECT EmployeeID,LoginName,ManagerID'''''LEVEL'FROM @ Org',但不知道從哪裏獲得'LEVEL'。 –

回答

1

查詢

;with CTE as 
(
    select EmployeeID 
     ,ManagerID 
     ,LoginName 
     ,0 as Level 
    from @Org Where ManagerID IS NULL 

    union all 

    select T.EmployeeID 
     ,T.ManagerID 
     ,T.LoginName 
     ,C.Level + 1 
    from @Org as T 
    inner join CTE C 
     on T.ManagerID = C.EmployeeID 
) 
select * 
from CTE 
Order by EmployeeID 

結果集

╔════════════╦═══════════╦═══════════╦═══════╗ 
║ EmployeeID ║ ManagerID ║ LoginName ║ Level ║ 
╠════════════╬═══════════╬═══════════╬═══════╣ 
║   1 ║ NULL  ║ Peter  ║  0 ║ 
║   2 ║ 1   ║ Larry  ║  1 ║ 
║   3 ║ 1   ║ John  ║  1 ║ 
║   4 ║ 1   ║ Lisa  ║  1 ║ 
║   5 ║ 2   ║ Linda  ║  2 ║ 
║   6 ║ 3   ║ Nathan ║  2 ║ 
║   7 ║ 3   ║ Tom  ║  2 ║ 
║   8 ║ 3   ║ Terry  ║  2 ║ 
║   9 ║ 4   ║ Lou  ║  2 ║ 
║   10 ║ 7   ║ David  ║  3 ║ 
║   11 ║ 9   ║ Ken  ║  3 ║ 
║   12 ║ 9   ║ Robert ║  3 ║ 
╚════════════╩═══════════╩═══════════╩═══════╝ 
+0

好的,你知道了。這幫助我瞭解他在找什麼。做得好! –