Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Endlosschleife in CTE beim Analysieren einer selbstreferenzierenden Tabelle

Der Grund für eine Endlosschleife ist der erste Datensatz mit empid=mgrid . Um dieses Problem zu lösen, sollten Sie ein kumulatives Feld (levels in diesem Beispiel), um mgrid zu speichern Sie haben bereits verarbeitet und prüfen, ob emid ist bereits in dieser Liste, um eine Schleife zu vermeiden.

Hier ist eine Abfrage:

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

Und hier ist SQLFiddle-Demo