sql >> Database teknologi >  >> RDS >> Sqlserver

Uendelig sløjfe i CTE ved parsing af selvhenvisningstabel

Årsagen til en uendelig løkke er den første post, hvor empid=mgrid . For at håndtere dette problem bør du inkludere et kumulativt felt (levels i dette eksempel) for at gemme mgrid du allerede har behandlet og kontroller, om emid er allerede på denne liste for at undgå en løkke.

Her er en forespørgsel:

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

Og her er SQLFiddle-demo




  1. SQL få data ud af BEGIN; ...; ENDE; blok i python

  2. MYSQL join opdatering interne trin

  3. Sådan vælger du rækkevidde baseret på feltværdier - MySQL

  4. Shell Script med sqlplus og specialtegn på adgangskode