Lý do của vòng lặp vô hạn là bản ghi đầu tiên trong đó empid=mgrid
. Để xử lý vấn đề này, bạn nên bao gồm một trường tích lũy (levels
trong ví dụ này) để lưu trữ mgrid
bạn đã xử lý và kiểm tra xem emid
đã có trong danh sách này để tránh lặp lại.
Đây là một truy vấn:
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
Và đây là SQLFiddle demo