Điều này dường như làm được các thủ thuật. Điều quan trọng là nhận ra rằng chúng ta có thể xây dựng con đường theo kiểu ngược và dừng lại khi chúng ta không còn cha mẹ để định vị:
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
Kết quả:
RootID ID ParentID Name Path
----------- ----------- ----------- ------------------- ----------------------------
10 2 NULL Johan John->Mathew->Cyril->Johan
7 1 NULL Antony Alex->Don->San->Antony
(Tôi đã để lại trong các cột bổ sung để giúp hiển thị trạng thái cuối cùng. Truy vấn CTE mà không lọc cũng có thể mang tính hướng dẫn)
Tôi cũng lưu ý rằng tôi thường sẽ không làm việc với các chuỗi được phân tách nếu có thể - nó không phải là một đại diện tuyệt vời khi SQL Server có các loại được thiết kế để làm việc với nhiều giá trị.