it-swarm.com.de

Listen Sie alle Eltern / Vorfahren aller Knoten auf

Ich habe folgende Struktur:

Beispielbaum:

(Tree Diagram

Beispieltabelle:

    [table]

    id  parent
    ----------
    1   NULL
    2   1
    3   1
    4   2
    5   2
    6   2
    7   3
    8   4

Für jede ID möchte ich alle ihre Eltern, einschließlich ihrer Vorfahren, in einer separaten Zeile auflisten.

Gewünschte Ausgabe:

    id  parent
    ----------
    1   NULL
    2   1
    3   1
    4   1
    4   2
    5   1
    5   2
    6   1
    6   2
    7   1
    7   3
    8   1
    8   2
    8   4

Ich habe versucht, einen CTE zu verwenden, aber ich kann meinen Kopf nicht darum wickeln.

    with temp(id,parent) as (
    SELECT S.id, S.parent
    FROM [table] as S 

    UNION ALL

    SELECT S2.id, S2.parent
    FROM [table] as S2 
    inner join temp on S2.id=temp.parent and temp.id is not null
    )

    SELECT * FROM temp order by id

Ich versuche, einen Hierarchiebaum zu durchlaufen und alle Knoten, auf die er trifft, in einer separaten Zeile für alle Startpunkte des Baums aufzulisten. So wurden mir die Beispieldaten gegeben.

6
Matthew Davons

Sie waren auf dem richtigen Weg und hatten es fast geschafft. Bei der Auswahl des zweiten Abschnitts sollte die übergeordnete Spalte vom cte anstelle von S2 stammen, und auch im zweiten Abschnitt war der Join rückwärts (S2.id = p.parent vs S2.parent = p.id). Aber das ist es!

create table [table]
(
id int,
parent int
);

insert into [table] values(1,NULL),
    (2,1),
    (3,1),
    (4,2),
    (5,2),
    (6,2),
    (7,3),
    (8,4);


;WITH ctetable(id, parent, depth, path) as 
(
    SELECT S.id, S.parent, 1 AS depth, convert(varchar(100), S.id) AS path
    FROM [table] as S
    UNION ALL
    SELECT S2.id, p.parent, p.depth + 1 AS depth, convert(varchar(100), (RTRIM(p.path) +'->'+ convert(varchar(100), S2.id)))
    FROM ctetable AS p JOIN [table] as S2 on S2.parent = p.id
    WHERE p.parent is not null
)
SELECT * FROM ctetable ORDER BY id, parent;
9
indiri