递增地添加字符串类型的列的行值

问题描述

我有一个具有以下值的表

 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;

Fiddle

,

这是一个可以计算级别并附加路径的版本。

数据

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