插入具有先前行信息的新列

Luí*_*ago 2 sql sql-server management-studio-express

我有这张桌子:

   Id  |Name        |ParentId 
    1  |John        |Null     
    2  |Oscar       |1        
    3  |Peter       |2        
    4  |Abbey       |3        
    5  |Adrian      |4        
    6  |Barbara     |5    
Run Code Online (Sandbox Code Playgroud)

我想做一个选择,它会给我一个新列,它由parentId获取前一个名称,以生成一个listName(按ParentID排序).

这个例子中的最终结果是这样的:

   Id  |Name        |ParentId     | List
    1  |John        |Null         | John
    2  |Oscar       |1            | John-Oscar
    3  |Peter       |2            | John-Oscar-Peter
    4  |Abbey       |3            | John-Oscar-Peter-Abbey
    5  |Adrian      |4            | John-Oscar-Peter-Abbey-Adrian
    6  |Barbara     |5            | John-Oscar-Peter-Abbey-Adrian-Barbara
Run Code Online (Sandbox Code Playgroud)

渴望得到所有帮助!

dea*_*ean 5

您可以使用递归CTE来生成所需的结果:

declare @t table (Id int, Name varchar(20), ParentId int)
insert @t values
(    1  ,'John'        ,Null     ),
(    2  ,'Oscar'       ,1        ),
(    3  ,'Peter'       ,2        ),
(    4  ,'Abbey'       ,3        ),
(    5  ,'Adrian'      ,4        ),
(    6  ,'Barbara'     ,5    )

;with x as (
    select *, cast(name as varchar(1000)) as list from @t where parentid is null
    union all
    select t.id, t.name, t.parentid, cast(x.list+'-'+t.name as varchar(1000)) from @t t join x on t.parentid = x.id
)
select * from x
Run Code Online (Sandbox Code Playgroud)

当然,这也适用于多个根.