無限ループの原因は、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
プレ>