2011-12-13 81 views
0

嗨我正在嘗試獲取我的類別的完整層次結構。這裏是我的樣品臺如何使用SQL CTE獲取完整層次結構

ID  PARENT_ID  NAME   DEPTH 
------------------------------------------ 
1  NULL   A    1 
2  NULL   B    1 
3  NULL   C    1 
4  1    D    2 
5  4    E    3 

CTE的輸出應該是這個

ID  PARENT_ID  NAME 
--------------------------- 
1  NULL   A    
2  NULL   B    
3  NULL   C    
4  1    D    
5  4    E    
5  1    E 

正如你可以看到ID:5的4家長和1.如何查詢整個樹

回答

2
DECLARE @tmp TABLE(ID INT,ParentID INT,NAME VARCHAR(10),DEPTH INT) 

INSERT INTO @tmp VALUES 
(1  ,NULL   ,'A'    ,1), 
(2  ,NULL   ,'B'    ,1), 
(3  ,NULL   ,'C'    ,1), 
(4  ,1    ,'D'    ,2), 
(5  ,4    ,'E'   ,3), 
(6  ,5    ,'F'   ,4); 

select * from @tmp 

;WITH cte AS 
(
    SELECT A.ID 
      ,A.ParentID 
      ,A.NAME 
      ,A.DEPTH 
    FROM @tmp A 

    UNION ALL 

    SELECT A.ID 
      ,B.ParentID 
      ,A.NAME 
      ,A.DEPTH 
    FROM cte A 
    INNER JOIN @tmp B on A.ParentID = B.ID 
    WHERE B.ParentID IS NOT NULL 

) 

SELECT * FROM cte 
+0

謝謝你這個工作.. – Luke101

+0

如果有多個行在相同的深度,即如果有三個深度3行和父母4 – Asher

+0

你好,我已經發布了另一個關於此主題的問題在這裏:http://stackoverflow.com/a/8517097/184773。你能檢查一下嗎?我看到你對sql server非常瞭解。 – Luke101

1

在SQL Server 2008中,可以使用CTE遞歸查詢。從MSDN

CTE的

示例 - 解決方案(未測試)

;With TableCTE(Id, Name, ParentId, Depth) 
(
    Select ID,Name,ParentId, 1 
    FROM MyTable 

    Union All 

    Select C.Id, C.Name, t.ParentId, c.Depth +1 
    FROM @tmp t 
    INNER JOIN TableCTE C on t.Id = c.ParentId 
    -- Where t.ParentId IS Not Null 
) 

SELECT Id, Name, ParentId 
FROM TableCTE 
+0

我試過,但它並沒有返回ID:5是ID的父: 1 – Luke101

+0

CTE遞歸循環直到它返回任何行,所以如果你想循環回來,我們必須調整一個查詢,請參閱更新的答案。 –

+0

刪除了「Where t.ParentId IS NOT NULL」子句,因爲它給出了錯誤的結果,即深度1和深度2全部被視爲深度1,隨後的深度比它們應該小1的次數爲 –

0
;WITH cte AS 
(
    SELECT A.ID 
      ,A.ParentID 
      ,A.NAME 
      ,A.DEPTH 
    FROM @tmp A 
    WHERE A.ParentID IS NULL 

    UNION ALL 

    SELECT B.ID 
      ,B.ParentID 
      ,B.NAME 
      ,B.DEPTH 
    FROM cte A 
       INNER JOIN 
      @tmp B on B.ParentID = A.ID 
    WHERE B.ParentID IS NOT NULL 

) 

SELECT * FROM cte