2016-06-24 4 views
1

Dies ist eine Variation des normalen CTE, in der Sie alle übergeordneten Elemente eines Knotens finden. Einziger Unterschied ist:Gemeinsamer Tabellenausdruck, bei dem in beiden Spalten keine Wurzeln vorhanden sind

  • Der größte Nachkomme hat kein null Kind. Stattdessen ist es einfach nicht in der Spalte child vorhanden.

Hier ist mein Versuch:

insert into t (parent, child) values (1, 2) 
insert into t (parent, child) values (1, 3) 
insert into t (parent, child) values (4, 2) 
insert into t (parent, child) values (2, 5) 
insert into t (parent, child) values (2, 6) 
insert into t (parent, child) values (9, 6) 
insert into t (parent, child) values (6, 7) 
insert into t (parent, child) values (6, 8) 

with cte as 
( 
    select child, parent, 0 as level 
    from t 
    where parent = 5 
    union all 
    select q.child, q.parent, level+1 
    from t q 
    inner join cte as c on c.parent= q.child 
) 

select distinct parent from cte 
where parent <> 5 

In diesem Fall, wenn ich versuche, alle Eltern für 5 zu bekommen, ist nichts gefunden, weil 5 kein Elternteil jemand ist. Wenn ich versuche, alle Eltern für 2 zu finden, ist es jedoch erfolgreich, weil 2 ein Elternteil zu 5 und 6 ist.

+0

Dies keine gangbare Hierarchie ist. 2 & 6 werden zweimal als Kinder aufgeführt. Ich habe sogar den Feldnamen geändert, vielleicht ist das ein Kopier-/Einfügefehler. Dein Cte wird eine Hierarchie aufbauen, du magst die Resultate vielleicht nicht mögen 6 hatte die größte Bevölkerung –

+0

Ich habe nie gesagt, dass es ein Baum war. Nichts sagt, dass ein Kind nicht mehrere Eltern haben kann oder dass ein Elternteil nicht mehrere Kinder haben kann. – jiaweizhang

+0

Wenn dies eine Frei/Ad-hoc-Hierarchie ist, ist das in Ordnung. Ich stimme zu, dass ein Kind mehrere Eltern haben kann (d. H. Ein Bericht kann zu Risk Analytics und vierteljährlichen Ergebnissen gehören), aber warum dann die Frage? Klar ist 5 kein Elternteil. –

Antwort

2

Wenn 5 kein Elternteil ist, dann gibt Ihr Filter parent=5 niemals eine Ausgabe aus. 5 ist ein child und Sie möchten alle Eltern darüber finden:

declare @t table (parent int, child int) 

insert into @t (parent, child) 
values (1, 2), 
(1, 3), 
(4, 2), 
(2, 5), 
(2, 6), 
(9, 6), 
(6, 7), 
(6, 8) 

;with cte as 
( 
    select child, parent, 0 as level 
    from @t 
    where child = 5 ---<<< 
    union all 
    select q.child, q.parent, level+1 
    from @t q 
    inner join cte as c on c.parent= q.child 
) 

select distinct parent from cte 
where parent <> 5 

enter image description here

+0

Ah. Vielen Dank. Das war wirklich dumm von mir. Changed "Eltern" zu "Kind" und es hat funktioniert. – jiaweizhang

Verwandte Themen