如何递归读取所有记录并按级别显示深度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)
(这是最大可能的级别)