2017-02-17 5 views
2

У меня есть эта таблица:Вставьте новый Колум с информацией предыдущих строк

Id |Name  |ParentId 
    1 |John  |Null  
    2 |Oscar  |1   
    3 |Peter  |2   
    4 |Abbey  |3   
    5 |Adrian  |4   
    6 |Barbara  |5  

и я хочу, чтобы сделать выбор, который даст мне новую колонку, которая получает предыдущее имя с помощью ParentID сделать ИМЯ_СПИСОК (Заказ по 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 

Thnks за помощь!

+0

Какую базу вы используете? –

+0

Флаг говорит, что сервер sql x) –

+0

Извините, пользуясь этим. –

ответ

5

Вы можете использовать рекурсивный КТР для получения желаемого результата:

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 

Это также работает для нескольких корней, конечно.

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 
Смежные вопросы