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

时间:2018-12-04 10:20:43

标签: sql sql-server

我正在寻找一种方法,以基于顶级父项的查询为基础来查询整个树结构(包括顶级父项,最后是最底层子项)。

但是!它应该返回: -结构(一个以上的要素), -或仅一个元素(顶层结构,如果下面没有子级-但在这种情况下,只有在没有任何“更高”的情况下-在这种情况下, 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

基于查询 230 231 232 233 ,结果应为

基于查询 300 的结果应为:

300
301
302
303
304

基于查询 301 ,结果应为:

301
302
303

基于查询 302 的结果应为:

302
303

基于查询 303 304 ,结果应为

基于查询 305 ,结果应为:

305

1 个答案:

答案 0 :(得分:1)

修改您上一个问题中的answer以适应新要求。开始遍历层次结构时,您需要在递归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