Dette ser ud til at gøre tricket. Nøglen er at indse, at vi kan bygge vejen op på baglæns måde og stoppe, når vi ikke længere har en forælder at finde:
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
Resultat:
RootID ID ParentID Name Path
----------- ----------- ----------- ------------------- ----------------------------
10 2 NULL Johan John->Mathew->Cyril->Johan
7 1 NULL Antony Alex->Don->San->Antony
(Jeg har forladt i yderligere kolonner for at hjælpe med at vise den endelige tilstand. Forespørgsel til CTE uden filtrering kan også være lærerigt)
Jeg vil også advare om, at jeg normalt ikke ville arbejde med afgrænsede strenge, hvis det overhovedet er muligt - det er ikke en god repræsentation, når SQL Server har typer designet for at arbejde med flere værdier.