2016-11-19 7 views
0

深度のある従業員とマネージャー名を表示する必要があります。SQL Server:深さの階層クエリ

サイモンは、トップマネージャーで、ケイティのマネージャがサイモンで、Johnのマネージャがケイティの場合、私は以下しようとした彼がトップで、ケイティのレベルが1になり、ジョンのレベルが2

となりますので、その後、サイモンのレベルは0になります希望の出力が得られません。コードで訂正するものを教えてください。

マイコード:

Declare @ID INT 
SET @ID = 6; 

WITH EmployeeCTE AS 
(
    SELECT 
     ID, Name, MgrID, 0 AS level 
    FROM 
     Employee 
    WHERE 
     ID = @ID 

    UNION ALL 

    SELECT 
     emp.ID, emp.Name, emp.MgrID, level+1 AS level 
    FROM 
     Employee emp 
    JOIN 
     EmployeeCTE ON emp.ID = EmployeeCTE.MgrID 
) 
--select * from EmployeeCTE 
SELECT 
    e1.Name, ISNULL(e2.Name, 'Top BOSS') as [Manager Name], 
    e2.level 
FROM 
    EmployeeCTE e1 
LEFT JOIN 
    EmployeeCTE e2 ON e1.MgrID = e2.ID 

答えて

1

これが最終的な選択[レベル]でノード・ツー・トップ、予告なので

;WITH EmployeeCTE AS 
(
    Select ID,Name,MgrID, 0 as level FROM @Employee 
    WHERE ID=3 
    UNION ALL 
    Select r.ID,r.Name,r.MgrID, level+1 as level 
    FROM @Employee r 
    JOIN EmployeeCTE p on r.ID = p.MgrID 
) 
Select e1.Name 
     ,ISNULL(e2.Name,'Top BOSS') as [Manager Name] 
     ,row_number() over (order by e1.level desc) as [Level] 
from EmployeeCTE e1 
left join EmployeeCTE e2 on e1.MgrID=e2.ID 

戻り

Name Manager Name Level 
Simon Top BOSS  1 
Katie Simon   2 
John Katie   3 
+1

@Mou楽しみのためだけにあなたの最終的な選択にe1.levelを含めます。フェッチしたFIRSTノードがレベル0であることがわかります(レベルが上がるとレベルが上がります)。それを動的に修正するには、逆順のシーケンスを取得するだけです。したがって、降順 –