繁体   English   中英

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

[英]How to get self-referenced table tree structure, based on parent node in tree?

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

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

基于查询230231232233 ,结果应该为

基于查询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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM