sql - 插入包含前几行信息的新列

标签 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 获取以前的名称来制作一个 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

感谢所有帮助!

最佳答案

您可以使用递归 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

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

关于sql - 插入包含前几行信息的新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42296732/

相关文章:

sql - 从字符串中删除特定单词

MySQL 升级后 MySQL NOT IN 查询速度变慢

mysql - 我应该尽可能避免复合主键吗?

sql - 从 Excel 导入转换日期

sql-server - 当MSSQL表中某列的值达到最大值时会发生什么以及解决办法?

SQL Server 2008删除特殊模式下的所有表

sql-server - 获取两个表的连接的不同计数

c# - IDENTITY_INSERT SQL 脚本