sql >> Databasteknik >  >> RDS >> Sqlserver

Oändlig loop i CTE vid analys av självreferenstabell

Anledningen till en oändlig loop är den första posten där empid=mgrid . För att hantera detta problem bör du inkludera ett kumulativt fält (levels i det här exemplet) för att lagra mgrid du har redan bearbetat och kontrollera om emid finns redan i den här listan för att undvika en loop.

Här är en fråga:

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

Och här är SQLFiddle-demo




  1. Exekvera en Oracle Stored Procedur från SQL Server 2005

  2. Räkna och visa hur många av specifika kolumner som resultat

  3. Hur hanterar jag band när jag rangordnar resultat i MySQL?

  4. ATAN() Funktion i Oracle