【问题标题】:Get root and top level from SQL tree从 SQL 树中获取根和顶层
【发布时间】:2021-08-26 19:26:54
【问题描述】:

我有一个树表。而且,我将在这棵树上获得根和顶层。

帮助解决方案,您可以使用任何您想要的东西

declare @disc table (
    id int,
    parent int,
    label varchar(50)
)

insert into @disc
select *
from (
values (1, null,    'q_1'),
       (2, 1,       'a_1_1'),
       (3, 2,       'a_1_1_1'),
       (4, 1,       'a_1_2'),
       (5, null,    'q_5'),
       (6, 5,       'a_5_1'),
       (7, 5,       'a_5_2')
) x (id, parent, label);

1. q_1
   2. a_1_1
      3. a_1_1_1
   4. a_1_2
5. q_5
   6. a_5_1
   7. a_5_2

而且,我的结果应该是这样的:

1: 1, null, q_1
2: 2, 1,    a_1_1
3: 5, null, q_5
4: 6, 5,    a_5_1

1: 1, null, q_1
2: 5, null, q_5
3: 2, 1,    a_1_1
4: 6, 5,    a_5_1

我只找到了一种方法,但我相信有更好的解决方案:

with rec as (
    select id, parent, label,
    row_number() over(order by id) rnk,
    1 lvl
    from @disc
    where parent is null
union all
    select d.id, d.parent, d.label,
    row_number() over(order by d.id) rnk,
    r.lvl + 1
    from rec r
    join @disc d on r.id = d.parent
)
select *
from rec
where parent is null or (rnk = 1 and lvl = 2) 

【问题讨论】:

  • 请分享您目前的尝试

标签: sql sql-server tsql recursion tree


【解决方案1】:

如果我理解这一点,则根节点中的父值将为 null。下一层将有一个根节点作为父节点。所以...

;with roots as
(
    select id, parent, label
    from @disc
    where parent is null
)
select id, parent, label
from roots
union
select id, parent, label
from @disc
where parent in (select id from roots)

【讨论】:

  • 根和一个第一顶级
【解决方案2】:

看起来您实际上并不想在这里递归。

您可以在应用程序中进行自加入。

select
  row_number() over (order by isnull(c.parent, c.id), c.id),
  c.id,
  c.parent,
  c.label
from @disc p
cross apply (
    select p.id, p.parent, p.label
    union all
    select top 1 c.id, c.parent, c.label
      from @disc c
      where p.id = c.parent
      order by c.id
) c
where p.parent is null;

db<>fiddle

【讨论】:

  • 不,不是全部在行中,应该在不同的行中:root_a top_a ... root_b top_b
  • 抱歉现在应该修复
猜你喜欢
  • 1970-01-01
  • 2015-05-17
  • 2015-04-25
  • 2014-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-03
相关资源
最近更新 更多