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

时间:2017-02-17 11:25:28

标签: 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    

我想做一个选择,它会给我一个新的列,该列通过parentId获取前一个Name,以生成一个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

向所有人提供帮助!

2 个答案:

答案 0 :(得分: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

当然,这也适用于多个根源。

答案 1 :(得分:2)

这与将列连接到行

相同
select id,name,pid,
stuff((select '-'+name from yourtable  n2 where n2.id<=n1.id for xml path('')),1,1,'') b
from yourtable n1