sql >> Database >  >> RDS >> Sqlserver

Oneindige lus in CTE bij het ontleden van zelfverwijzende tabel

De reden van een oneindige lus is het eerste record waar empid=mgrid . Om dit probleem op te lossen, moet u een cumulatief veld opnemen (levels in dit voorbeeld) om mgrid op te slaan die je al hebt verwerkt en controleer of emid staat al in deze lijst om een ​​lus te voorkomen.

Hier is een vraag:

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

En hier is SQLFiddle-demo




  1. HOE selecteer min van cast varchar naar int in mysql

  2. gegevens ophalen uit twee tabellen in mysql, join zou hier niet werken

  3. Een rij verwijderen met een naar zichzelf verwijzende refererende sleutel

  4. Kan Oracle-opgeslagen proc niet raken met .Net EF(2.2) Core-repositorypatroon