如何递归读取所有记录并按级别显示深度TSQL

如何递归读取所有记录并按级别显示深度TSQL,tsql,select,recursion,Tsql,Select,Recursion,有没有一种方法可以按深度级别以类似的表和顺序递归读取记录 #table: id int | parent int | value string -------------------------------------------- 1 -1 some 2 1 some2 3 2 some3 4

有没有一种方法可以按深度级别以类似的表和顺序递归读取记录

#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和子对象的递归

多谢各位

;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

您可以使用CTE,特别是RCTE来完成

有关详细信息,请参见和

要遵循的示例:

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
    )

这两个表是如何关联的?为什么跳过id 1?它是同一个表,我只是想指出如果我为select选择id=3会发生什么。就像指针一样,它使用递归公共表表达式(CTE)。有很多关于它们的文章,所以如果你想谷歌sql CTE,你可以找到更多关于它们的信息。只是一个小小的添加-如果你的表有很多记录,那么在第二个union all查询中添加一个子句
,其中C.Depth<100
。此外,我认为最大递归级别是100,因此如果这对您来说还不够,那么在最后只需添加
选项(MAXRECURSION 32767)
(这是最大可能的级别)