2016-05-24 21 views
1

私は以下のテーブルからorg char階層を表示するために再帰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

Thのように見えるように取得しようはCTEではありません。ご覧になるコードはありますか? @Orgをテーブルのように出力したいだけですか? 「レベル」はどこから来たのですか? –

+0

この 'SELECT EmployeeID、LoginName、ManagerID、 '' AS '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

よかった、あなたはそれを得て良かった。これは私が彼が探していたものを理解するのに役立ちました。よくやった! –

関連する問題