【问题标题】:How to get self-referenced table tree structure, based on parent node in tree?如何根据树中的父节点获取自引用的表树结构?
【发布时间】:2018-12-04 10:20:42
【问题描述】:

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

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

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

305

【问题讨论】:

  • 当您查询301 时为什么要303
  • 因为 303 是子 id 302,其中 302 是子 od 301

标签: sql sql-server


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多