MrW*_*MrW 10 sql recursive-query sql-server-2008
我有一个问题,我无法理解.我知道我想要什么,只是简直无法在屏幕上看到它.我有一个看起来像这样的表:
Id, PK UniqueIdentifier, NotNull
Name, nvarchar(255), NotNull
ParentId, UniqueIdentifier, Null
Run Code Online (Sandbox Code Playgroud)
ParentId有一个FK到Id.
我想要完成的是获得我传入的Id下方所有id的平面列表.
例:
1 TestName1 NULL
2 TestName2 1
3 TestName3 2
4 TestName4 NULL
5 TestName5 1
Run Code Online (Sandbox Code Playgroud)
树看起来像这样:
-1
-> -2
-> -3
-> -5
-4
Run Code Online (Sandbox Code Playgroud)
如果我现在要求4,我只会回来4,但如果我要求1,我会得到1,2,3和5.如果我要求2,我会得到2和3,依此类推.
有谁能指出我正确的方向.我的大脑很油炸,所以我很感激能得到的所有帮助.
Mik*_*son 15
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
Run Code Online (Sandbox Code Playgroud)
结果
Id Name ParentId
----------- -------------------- -----------
1 TestName1 NULL
2 TestName2 1
5 TestName5 1
3 TestName3 2
Run Code Online (Sandbox Code Playgroud)
这是一个工作示例:
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
Run Code Online (Sandbox Code Playgroud)
您可以过滤baseid
,其中包含您要查询的树的开头。