Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Nieskończona pętla w CTE podczas analizowania tabeli odwołującej się do siebie

Powodem nieskończonej pętli jest pierwszy rekord, w którym empid=mgrid . Aby poradzić sobie z tym problemem, należy dołączyć pole zbiorcze (levels w tym przykładzie) do przechowywania mgrid już przetworzyłeś i sprawdź, czy emid jest już na tej liście, aby uniknąć pętli.

Oto zapytanie:

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 oto demonstracja SQLFiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj datę na format RRRRMM

  2. Jak utworzyć tabelę w SQL Server

  3. Czym jest BETWEEN operator logiczny w SQL Server — samouczek SQL Server / TSQL część 124

  4. Krzyż stosuje się w Linq

  5. Jak przekonwertować 3/4 znakową liczbę całkowitą na 24-godzinny format czasu i połączyć z datą?