一尘不染

SQL中的递归选择

sql

我有一个问题,就是无法解决。我知道我想要的,只是无法在屏幕上显示出来。我有一张桌子,看起来像这样:

Id, PK UniqueIdentifier, NotNull
Name, nvarchar(255), NotNull
ParentId, UniqueIdentifier, Null

ParentId具有FK到ID。

我要完成的工作是获取我传递的ID下方所有ID的完整列表。

例子:

1   TestName1    NULL
2   TestName2    1
3   TestName3    2
4   TestName4    NULL
5   TestName5    1

这棵树看起来像这样:

-1
  -> -2
       -> -3
  -> -5
-4

如果我现在要求4,我将只得到4,但是如果我要求1,我将得到1、2、3和5。如果我要求2,我将得到2和3,依此类推。

有谁能指出我正确的方向。我的大脑炸了,所以我感谢我能得到的所有帮助。


阅读 124

收藏
2021-03-10

共1个答案

一尘不染

declare @T table(
  Id int primary key,
  Name nvarchar(255) not null,
  ParentId int)

insert into @T values
(1,   'TestName1',    NULL),
(2,   'TestName2',    1),
(3,   'TestName3',    2),
(4,   'TestName4',    NULL),
(5,   'TestName5',    1)

declare @Id int = 1

;with cte as
(  
  select T.*
  from @T as T
  where T.Id = @Id
  union all
  select T.*
  from @T as T
    inner join cte as C
      on T.ParentId = C.Id
)
select *
from cte

结果

Id          Name                 ParentId
----------- -------------------- -----------
1           TestName1            NULL
2           TestName2            1
5           TestName5            1
3           TestName3            2
2021-03-10