ऐसा लगता है कि यह चाल है। कुंजी यह महसूस करना है कि हम पीछे की ओर रास्ता बना सकते हैं और तब रुक सकते हैं जब हमारे पास पता लगाने के लिए माता-पिता न हों:
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
परिणाम:
RootID ID ParentID Name Path
----------- ----------- ----------- ------------------- ----------------------------
10 2 NULL Johan John->Mathew->Cyril->Johan
7 1 NULL Antony Alex->Don->San->Antony
(मैंने अंतिम स्थिति दिखाने में मदद के लिए अतिरिक्त कॉलम छोड़े हैं। बिना फ़िल्टर किए सीटीई को क्वेरी करना भी शिक्षाप्रद हो सकता है)
मैं यह भी सावधानी बरतता हूं कि यदि संभव हो तो मैं आमतौर पर सीमित तारों के साथ काम नहीं करता - यह एक अच्छा प्रतिनिधित्व नहीं है जब SQL सर्वर के प्रकार डिज़ाइन किए गए हैं एकाधिक मानों के साथ काम करने के लिए।