如何基于树中的父节点获得自引用的表树结构



我正在寻找一种方法,在基于顶部父级的查询的基础上,查询整个树结构(包括顶部父级,结束底部子级(。

但是!它应该返回:-结构(不止一个元件(,-或者只有一个元素(顶层结构,如果下面没有子级-但在这种情况下,只有当没有"更高"的东西时-ParentID在这种情况中为NULL(。

即与一起用餐

|--------------|
|ID  | ParentID|
|--------------|
|229 | NULL    |
|230 | 229     |
|231 | 229     |
|232 | 229     |
|233 | 229     |
|              |
|300 | NULL    |
|301 | 300     |
|302 | 301     |
|303 | 302     |
|304 | 300     |
|              |
|305 | NULL    |
----------------

基于对229的查询,结果应该是:

229
230
231
232
233

基于查询230231232或者233,结果应该是

基于对300的查询,结果应该是:

300
301
302
303
304

基于对301的查询,结果应该是:

301
302
303

基于对302的查询,结果应该是:

302
303

根据查询303304,结果应为

基于对305的查询,结果应该是:

305

修改您上一个问题的答案以满足新的需求。当开始遍历层次结构时,您需要在递归CTE中添加一个检查,以查看这是一个父节点还是它的任何子节点:

declare @Table table(ID int, ParentID int)
insert into @Table(ID, ParentID) values
(229, NULL),
(230, 229 ),
(231, 229 ),
(232, 229 ),
(233, 229 ),
(300, NULL),
(301, 300 ),
(302, 301 ),
(303, 302 ),
(304, 300 ),
(305, NULL )
declare @LookingForId int = 305
; with cte as (
select ID from @Table t1 where t1.ID = @LookingForId and (t1.ParentID is null or exists (select * from @Table t2 where t2.ParentID = t1.ID))
union all
select t.ID from @Table t inner join cte on cte.ID = t.ParentID
)
select * from cte

最新更新