2017-11-08 4 views
0

Ich habe die folgende Tabelle:SQL-Gruppe mit 2 Reihen auf Spalte basierend Werte

Row ID Name Parent 
1 c1 John p1 
2 c2 Dave p2 
3 p1 Lex p3 

ich zusammenfassen möchten die Zeilen, die ein Kind und Eltern-Beziehung durch die ID und Eltern Spalten zum Beispiel angegeben haben

die Abfrage sollte

Row ID Name Parent 
1 c1 John p1 
3 p1 Lex p3 
2 c2 Dave p2 

Irgendwelche Tipps zurückkehren, wie dies zu erreichen, ohne zusätzliche Spalten hinzufügen?

+1

Haben Sie wirklich Eltern _below_ ihre Kinder angezeigt werden soll? –

+0

Entschuldigung, ich habe vergessen zu sagen, MS SQL Server – p0enkie

+0

Es gibt keine 'p3' definiert; Woher wissen wir, wie tief die Hierarchie sein kann? –

Antwort

3

Da Sie auf SQL Server arbeiten, haben Sie die Möglichkeit, mit recursive CTE SQL query als ich die Codes unter

/* 
create table hierarchy_data 
(
Row int, 
ID varchar(2), 
Name varchar(20), 
Parent varchar(2) 
) 
insert into hierarchy_data select 1 ,'c1', 'John', 'p1' 
insert into hierarchy_data select 2 ,'c2' ,'Dave' ,'p2' 
insert into hierarchy_data select 3 ,'p1' ,'Lex' ,'p3' 
*/ 
;with cte as (
    select 
     row, 
     id, 
     name, 
     parent, 
     row_number() over (order by id) as groupno, 
     1 as level 
    from hierarchy_data 
    where parent not in (
     select id from hierarchy_data 
    ) 

    union all 

    select 
     h.row, 
     h.id, 
     h.name, 
     h.parent, 
     cte.groupno, 
     cte.level + 1 
    from cte 
    inner join hierarchy_data h 
     on cte.id = h.parent 

) 
select * 
from cte 
order by groupno, level 

Hierarchie oder Eltern-Kind-Beziehung geteilt innerhalb des CTE Ausdruck gebaut wird. Durch die ORDER BY-Klausel verwenden Sie die Ausgabe sortiert werden können, wie Sie

Der Ausgang als

ist wünschen

enter image description here

Verwandte Themen