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,依此类推。 有谁能指出我正确的方向。我的大脑炸了,所以我感谢我能得到的所有帮助。     
已邀请:
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
    
这是一个工作示例:
declare @t table (id int, name nvarchar(255), ParentID int)

insert @t values
(1,   \'TestName1\',    NULL),
(2,   \'TestName2\',    1   ),
(3,   \'TestName3\',    2   ),
(4,   \'TestName4\',    NULL),
(5,   \'TestName5\',    1   );

; with rec as
        (
        select  t.name
        ,       t.id as baseid
        ,       t.id
        ,       t.parentid
        from    @t t
        union all
        select  t.name
        ,       r.baseid
        ,       t.id
        ,       t.parentid
        from    rec r
        join    @t t
        on      t.ParentID = r.id
        )
select  *
from    rec
where   baseid = 1
您可以过滤
baseid
,其中包含您要查询的树的开头。     
尝试这个:
WITH RecQry AS
(
    SELECT *
      FROM MyTable
    UNION ALL
    SELECT a.*
      FROM MyTable a INNER JOIN RecQry b
        ON a.ParentID = b.Id
)
SELECT *
  FROM RecQry
    
这是一篇有关层次结构ID模型的好文章。它从数据的开始一直到查询设计。 另外,您可以使用具有公共表表达式的递归查询。     
我猜想完成目标的最简单方法是使用Common Table Expression编写递归查询: MSDN-使用公用表表达式的递归查询     

要回复问题请先登录注册