Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Безкраен цикъл в CTE при синтактичен анализ на самореферентна таблица

Причината за безкраен цикъл е първият запис, където empid=mgrid . За да се справите с този проблем, трябва да включите кумулативно поле (levels в този пример), за да съхраните mgrid вече сте обработили и проверете дали emid вече е в този списък, за да се избегне зацикляне.

Ето една заявка:

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

А ето и демонстрация на 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. SQL Server:INNER JOIN след UNION води до бавно хеш съвпадение (обобщен)

  2. Как да активирам MSDTC на SQL Server?

  3. Топ 5 факта за намиране и замяна на SQL текстове в SQL Server с функция REPLACE

  4. Как да конвертирате между часови зони в SQL Server 2008?

  5. IN оператор SQL