2012-04-25 47 views
1

有沒有辦法以相似的表格順序讀取記錄並按深度級別排序?如何遞歸讀取所有記錄並按級別深度顯示TSQL

#table: 

id int | parent int | value string 
-------------------------------------------- 
1    -1    some 
2    1     some2 
3    2     some3 
4    2     some4 
5    3     some5 
6    4     some6 
7    3     some5 
8    3     some5 
9    8     some5 
10   8     some5 

那麼,有沒有辦法遞歸選取結果表是這樣的。

select * from #table where id=3 

id int  | parent int  | value string | depth 
-------------------------------------------------------- 
3    2     some3    0 
5    3     some5    1 
7    3     some5    1 
8    3     some5    1 
9    8     some5    2 
10   8     some5    2 

所以,如果讓我選擇的id = 3我會看到ID = 3名兒童遞歸

謝謝

+0

如何都表有關係嗎?你爲什麼跳過ID 1? – 2012-04-25 07:22:56

+0

這是同一張表,我只想指出如果我選擇id = 3進行選擇會發生什麼。 – feronovak 2012-04-25 07:25:46

回答

2
;with C as 
(
    select id, 
     parent, 
     value, 
     0 as depth 
    from YourTable 
    where id = 3 
    union all 
    select T.id, 
     T.parent, 
     T.value, 
     C.depth + 1 
    from YourTable as T 
    inner join C 
     on T.parent = C.id 
) 
select * 
from C 

SE-Data

+0

就像一個指針一樣,它使用遞歸公用表表達式(CTE)。有很多關於它們的文字,所以如果你想要Google sql CTE,你可以找到更多關於它們的信息。 – 2012-04-25 12:01:01

2

可以完成使用CTE,尤其是rCTEs。

有關更多信息,請參見thisthis

榜樣:

WITH sampleCTE (id, parent, value, depth) 
    AS (
     -- Anchor definition 
     SELECT id 
      , parent 
      , value 
      , 0 
     FROM #table 
     WHERE id = @targetId 
     -- Recursive definition 
     UNION ALL 
     SELECT child.id 
      , child.parent 
      , child.value 
      , sampleCTE.depth + 1 
     FROM #table child 
      INNER JOIN sampleCTE ON sampleCTE.id = child.parent 
    )