sql >> Databáze >  >> RDS >> Sqlserver

Nekonečná smyčka v CTE při analýze samoodkazovací tabulky

Důvodem nekonečné smyčky je první záznam, kde empid=mgrid . Chcete-li tento problém vyřešit, měli byste zahrnout kumulativní pole (levels v tomto příkladu) k uložení mgrid jste již zpracovali a zkontrolujte, zda emid je již v tomto seznamu, aby nedošlo ke smyčce.

Zde je dotaz:

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

A zde je ukázka SQLFiddle




  1. Můj dotaz SQL pro získání hodnot středního řádku pomocí funkce GROUP BY

  2. Je možné ve spouštěči MySQL nastavit uživatelskou proměnnou pomocí NEW.col a použít ji v aktualizačním dotazu?

  3. Pokud existuje, aktualizujte MySQL

  4. Reg. podpora transakcí pro jarní dávkovou úlohu na úrovni úlohy