sql server使用递归cte获取同组级别

问题描述

我有一个 sql server 表,显示了 ID 和它们以前的 ID,

create table test2 ( ID varchar(10),Pre_ID varchar(10)
)

insert into test2 values ('e','d'),('d','c'),('c','b'),('b','a'),('a',null),('r','q'),('q','p'),('p',null)

表是这样的:

enter image description here

结果应该是这样的:

enter image description here

我使用递归 cte 成功获得了级别,但无法为它们获得正确的组。有人可以帮忙吗?谢谢。

这是我的代码:

with cte as (
select id,Pre_ID,level
from #temp2
where Pre_ID is null

union all 

select t2.id,t2.Pre_ID,t2.level
from cte 
inner join #temp2 t2
on t2.Pre_ID=cte.id
)
select * from cte
order by id

解决方法

您需要做的是从第一个级别开始并添加一个 ROW_NUMBER,然后递归地加入所有其他级别:

with cte as (
    select id,Pre_ID,level,row_number() over (order by ID) as grp
    from #temp2
    where Pre_ID is null

    union all 

    select t2.id,t2.Pre_ID,t2.level,cte.grp
    from cte 
    inner join #temp2 t2
        on t2.Pre_ID=cte.id
)
select * from cte
order by id;

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...