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

Sql 如何基于树中的父节点获取自引用表树结构?,sql,sql-server,Sql,Sql Server,我正在寻找一种方法,在基于上父查询的基础上,查询整个树结构,包括上父、下子 但是!它应返回: -结构不止一个元素, -或者一个只包含一个元素的顶级结构,如果下面没有child,那么在本例中,只有在没有更高的child的情况下,ParentID在本例中为NULL 也就是说,桌子上有: |--------------| |ID | ParentID| |--------------| |229 | NULL | |230 | 229 | |231 | 229 | |232 |

我正在寻找一种方法,在基于上父查询的基础上,查询整个树结构,包括上父、下子

但是!它应返回: -结构不止一个元素, -或者一个只包含一个元素的顶级结构,如果下面没有child,那么在本例中,只有在没有更高的child的情况下,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
300
301
302
303
304
301
302
303
302
303
305
基于对230、231、232或233的查询,结果应该是空的

根据查询300,结果应该是:

229
230
231
232
233
300
301
302
303
304
301
302
303
302
303
305
查询301,结果应该是:

229
230
231
232
233
300
301
302
303
304
301
302
303
302
303
305
基于302的查询,结果应该是:

229
230
231
232
233
300
301
302
303
304
301
302
303
302
303
305
基于对303或304的查询,结果应该是空的

根据305的查询,结果应该是:

229
230
231
232
233
300
301
302
303
304
301
302
303
302
303
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
为什么查询301时使用303?因为303是子id 302,其中302是子od 301。