Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Auflisten aller Eltern eines Elements in einer Hierarchietabelle als SQL mit Trennzeichen

Dies scheint den Trick zu tun. Der Schlüssel ist zu erkennen, dass wir den Pfad rückwärts aufbauen und aufhören können, wenn wir keinen Elternteil mehr haben, den wir finden können:

DECLARE @t table (ID int not null, Name varchar(19) not null, ParentID int null)
insert into @t(ID,Name,ParentID) values
(1 ,'Alex',null),
(2 ,'John',null),
(3 ,'Don',1),
(4 ,'Philip',2),
(5 ,'Shiva',2),
(6 ,'San',3),
(7 ,'Antony',6),
(8 ,'Mathew',2),
(9 ,'Cyril',8),
(10,'Johan',9)

declare @search table (ID int not null)
insert into @search (ID) values (7),(10)

;With Paths as (
    select s.ID as RootID,t.ID,t.ParentID,t.Name, CONVERT(varchar(max),t.Name) as Path
    from
        @search s
            inner join
        @t t
            on
                s.ID = t.ID
    union all
    select p.RootID,t.ID,t.ParentID,p.Name, t.Name + '->' + p.Path
    from Paths p
            inner join
        @t t
            on
                p.ParentID = t.ID
)
select * from Paths where ParentID is null

Ergebnis:

RootID      ID          ParentID    Name                Path
----------- ----------- ----------- ------------------- ----------------------------
10          2           NULL        Johan               John->Mathew->Cyril->Johan
7           1           NULL        Antony              Alex->Don->San->Antony

(Ich habe zusätzliche Spalten gelassen, um den endgültigen Status anzuzeigen. Das Abfragen des CTE ohne Filterung kann ebenfalls aufschlussreich sein)

Ich möchte auch darauf hinweisen, dass ich normalerweise nicht mit Zeichenfolgen mit Trennzeichen arbeiten würde, wenn dies überhaupt möglich ist - es ist keine großartige Darstellung, wenn SQL Server Typen entworfen hat für die Arbeit mit mehreren Werten.