अनंत लूप का कारण पहला रिकॉर्ड है जहां empid=mgrid
. इस समस्या से निपटने के लिए आपको एक संचयी फ़ील्ड (levels
.) शामिल करना चाहिए इस उदाहरण में) mgrid
को स्टोर करने के लिए आप पहले ही संसाधित कर चुके हैं और जांचें कि क्या emid
लूप से बचने के लिए पहले से ही इस सूची में है।
यहाँ एक प्रश्न है:
with Tree as
(
SELECT empid
, mgrid
, 1 as lv
, 1 as level1
, null as level2
, null as level3
, null as level4
, null as level5
, cast(mgrid as varchar(max)) levels
FROM Employees
WHERE empid = 1 and mgrid = 1
UNION ALL
SELECT E.empid
, E.mgrid
, T.lv + 1
, T.level1
, case when T.lv = 1 then E.empid else t.level2 end
, case when T.lv = 2 then E.empid else t.level3 end
, case when T.lv = 3 then E.empid else t.level4 end
, case when T.lv = 4 then E.empid else t.level5 end
, T.levels+','+cast(E.mgrid as varchar(max)) levels
FROM Employees AS E
JOIN Tree T
ON E.mgrid = T.empid
and (','+T.levels+','
not like
'%,'+cast(E.empid as varchar(max))+',%')
)
select *
from Tree
order by empid
और यह रहा SQLFiddle डेमो