2017-02-17 2 views
2

Ich habe diese Tabelle:Einfügen eines neuer colum mit vorherigen Zeilen Informationen

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

und ich möchte eine wählen machen, die mir eine neue Spalte geben wird, die die vorherigen Namen mit der parentId einen Listennamen machen wird (Sortieren nach ParentID).

würde das Endergebnis in diesem Beispiel sein:

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 für alle Hilfe!

+0

Welche Datenbank verwenden Sie? –

+0

Flag sagt sql server x) –

+0

Sorry, die Teilnahme daran zu nutzen. –

Antwort

5

Sie können einen rekursiven CTE verwenden das gewünschte Ergebnis zu produzieren:

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 

Dies gilt auch für mehrere Wurzeln arbeitet, natürlich.

2

Dies ist die gleiche wie concatenate Spalten in Zeilen

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