2012-02-02 11 views
6

Ho una tabella che assomiglia a questo:ricorsiva concatenazione di Parent Elementi

ID  |Name |Parent 
1  |A  |NULL 
2  |B  |NULL 
3  |C  |1 
4  |D  |1 
5  |E  |3 
6  |F  |5 

mi piacerebbe avere una visione tornare questo:

ID  |Name |ParentNames 
1  |A  | 
2  |B  | 
3  |C  |A 
4  |D  |A 
5  |E  |A > C 
6  |F  |A > C > E 

ho cercato di sinistra unirsi a una vista che mostra un Gli ID erano i primi genitori e se ne andavano unendosi a se stessi, ma questo non funzionava.

C'è un modo per farlo senza una stored procedure/funzione? Ho ~ 15k righe con ~ 0-5 genitori ciascuna, ma preferirei non un codice difficile per un massimo di 5 genitori.

+0

Non ho un SSMS su questo comp. Controlla questo link per l'ispirazione: http://www.codeproject.com/Articles/21082/Concatenate-Field-Values-in-One-String-Using-CTE-i – Malk

risposta

8

È possibile utilizzare un recursive CTE.

declare @T table(ID int, Name char(1), Parent int); 

insert into @T values 
(1  ,'A'  ,NULL), 
(2  ,'B'  ,NULL), 
(3  ,'C'  ,1), 
(4  ,'D'  ,1), 
(5  ,'E'  ,3), 
(6  ,'F'  ,5); 

with C as 
(
    select ID, 
     Name, 
     Parent, 
     cast('' as varchar(max)) as ParentNames 
    from @T 
    where parent is null 
    union all 
    select T.ID, 
     T.Name, 
     T.Parent, 
     C.ParentNames + ' > ' + C.Name 
    from @T as T   
    inner join C 
     on C.ID = T.Parent 
)  
select ID, 
     Name, 
     stuff(ParentNames, 1, 3, '') as ParentNames 
from C;  
+0

Questo sembra interessante. Come lo faresti con elementi che possono cadere sotto più nodi genitori? Vedi la mia domanda qui http://stackoverflow.com/questions/31685852/sql-statement-to-concatenate-categories-from-hierarchical-structure-into-a-singl Spero che tu possa aiutare! – Flo