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

fer*_*vak 3 t-sql recursion select

有没有办法按类似的表递归读取记录并按深度级别排序?

#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
Run Code Online (Sandbox Code Playgroud)

那么有一种方法可以递归地选择结果表看起来像这样的地方.

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
Run Code Online (Sandbox Code Playgroud)

因此,如果我选择id = 3,我会看到id = 3和children的递归

谢谢

Mik*_*son 6

;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
Run Code Online (Sandbox Code Playgroud)

SE-数据


Mii*_* L. 5

您可以使用 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
    )
Run Code Online (Sandbox Code Playgroud)