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.