问题描述
UserID ParentID Levels Path
1 NULL 0 A1
5 1 1 A2
9 5 2 A3
43 9 3 A4
输出应如下所示:
UserID ParentID Levels FinalPath
1 NULL 0 A1/
5 1 1 A1/A2/
9 5 2 A1/A2/A3/
43 9 3 A1/A2/A3/A4/
在此先感谢您提供任何指导。
解决方法
使用可追溯的公用表表达式的解决方案。
样本数据
create table users
(
userid int,parentid int,levels int,path nvarchar(100)
);
insert into users (userid,parentid,levels,path) values
(1,NULL,'A1'),(5,1,'A2'),(9,5,2,'A3'),(43,9,3,'A4');
解决方案
with cte as
(
select u.userid,u.parentid,u.levels,u.path
from users u
where u.parentid is null
union all
select u.userid,convert(nvarchar(100),c.path + '/' + u.path)
from users u
join cte c
on c.userid = u.parentid
)
select c.userid,c.parentid,c.levels,c.path + '/' as FinalPath
from cte c;
,
这是一个可以计算级别并附加路径的版本。
数据
drop table if exists dbo.test_table;
go
create table dbo.test_table(
UserID int,ParentID int,[Path] varchar(5));
insert dbo.test_table([UserID],[ParentID],[Path]) values
(1,null,'A4');
查询
;with recur_cte([UserId],h_level,[Path]) as (
select [UserId],cast([Path] as varchar(100))
from dbo.test_table
where [ParentID] is null
union all
select tt.[UserId],tt.[ParentID],rc.h_level+1,cast(concat(tt.[Path],'/',rc.[Path]) as varchar(100))
from dbo.test_table tt join recur_cte rc on tt.[ParentID]=rc.[UserId])
select * from recur_cte;
结果
UserId ParentID h_level Path
1 NULL 0 A1
5 1 1 A1/A2
9 5 2 A1/A2/A3
43 9 3 A1/A2/A3/A4