3

부모 자식 관계를 반환하는 CTE가 있습니다. PanelID를 사용하여 where 절을 선택하면 하위 패널의 모든 부모를 가져옵니다. 그러나 깊이는 반대입니다. 나는 2로 자식 패널의 부서가 필요 상단 부모로 0SQL 상위 부모 행에 상대적인 하위 행 깊이 찾기

WITH category_cte AS 
(SELECT PanelID AS SourceID, PanelID, BP_DP, 0 AS depth FROM dbo.tblPanels 
        UNION ALL 
SELECT CTE.SourceID, C.PanelID, C.BP_DP, CTE.depth + 1 AS depth 
      FROM dbo.tblPanels AS C INNER JOIN 
       category_cte AS CTE ON C.SCID = CTE.PanelID) 
     SELECT  SourceID, PanelID, BP_DP, depth 
     FROM   category_cte AS category_cte_1 where PanelID = x 

반환 확실한 해결책은 하위 쿼리에서 쿼리를 포장하고 계산 ROW_NUMBER을 사용하는 것입니다

SourceID PanelID BP_DP depth 
1240   1240  1  0 
1446   1240  1  1 
1434   1240  1  2 
+0

반환되는 내용이 아닙니까? 계산 된 깊이로 반복적으로 CTE를 사용하면 최상위 노드가 0이고 후속 노드가> 0입니다. 따라서 조부모 - 부모 - 자식이있는 경우 0-1-2이됩니다. – BlackjacketMack

+0

반환 값은 자식에 대해 0을 제공합니다. 나는 그 반대를 찾고 있었다. – user1781272

답변

1

depth 내림차순 :

WITH category_cte AS 
(SELECT PanelID AS SourceID, PanelID, BP_DP, 0 AS depth 
FROM dbo.tblPanels 

UNION ALL 

SELECT CTE.SourceID, C.PanelID, C.BP_DP, CTE.depth + 1 AS depth 
FROM dbo.tblPanels AS C 
INNER JOIN category_cte AS CTE ON C.SCID = CTE.PanelID)  
SELECT SourceID, PanelID, BP_DP, 
     ROW_NUMBER() OVER (ORDER BY depth DESC) -1 AS depth 
FROM (
    SELECT SourceID, PanelID, BP_DP, depth 
    FROM category_cte AS category_cte_1 
    where PanelID = x) AS t