2010-11-12 63 views
4

我有以下表格:TSQL遞歸CTE線程排序

ID parentID name 

1 0   car1 
2 1   tire 
3 2   rubber 
4 0   car2 
5 2   nut 
6 3   black 

爲了幫助測試...

CREATE TABLE #TT (ID int 
       ,ParentID int 
       ,Name varchar(25) 
       ) 

INSERT #TT 
SELECT 1,0,'car1' UNION ALL 
SELECT 2,1,'tire' UNION ALL 
SELECT 3,2,'rubber' UNION ALL 
SELECT 4,0,'car2' UNION ALL 
SELECT 5,2,'nut' UNION ALL 
SELECT 6,3,'black' 

我試圖創建一個「線程」的層次,但我想列出子節點父母下,像這樣:

ID parentID name 

1 0   car1 
2 1   tire 
3 2   rubber 
6 3   black 
5 2   nut 
4 0   car2 

如果我使用遞歸CTE喜歡這個...

;WITH Features 
AS 
(
    SELECT * 
    FROM #TT 
    WHERE ParentID = 0 

    UNION ALL 

    SELECT F.* 
    FROM #TT AS F 
     INNER JOIN Features 
      ON F.ParentID = Features.ID 
) 

SELECT * 
FROM Features 

我結束了這個...

ID parentID name 

1 0   car1 
4 0   car2 
2 1   tire 
3 2   rubber 
5 2   nut 
6 3   black 

什麼想法?先謝謝你。

回答

3

,你走你可以建立一個樹路徑,並通過

喜歡的東西

DECLARE @TT TABLE(ID int, ParentID int, Name varchar(25)) 

INSERT @TT 
SELECT 1,0,'car1' UNION ALL 
SELECT 2,1,'tire' UNION ALL 
SELECT 3,2,'rubber' UNION ALL 
SELECT 4,0,'car2' UNION ALL 
SELECT 5,2,'nut' UNION ALL 
SELECT 6,3,'black' 


SELECT * 
FROM @TT 


;WITH Features AS (
     SELECT *, 
       CAST(ID AS VARCHAR(MAX)) + '/' AS TreePath 
     FROM @TT 
     WHERE ParentID = 0 
     UNION ALL 
     SELECT tt.*, 
       f.TreePath + CAST(tt.ID AS VARCHAR(10)) + '/' 
     FROM @TT tt INNER JOIN 
       Features f ON tt.ParentID = f.ID 
) 
SELECT * 
FROM Features 
ORDER BY TreePath 
+0

優秀astander爲了它! – John 2010-11-12 15:43:00

0

嘗試添加ORDER BY子句,如:

SELECT * FROM Features 
ORDER BY parentID