Använd nyckelordet WITH
en gång på toppen. Om något av dina vanliga tabelluttryck (CTE) är rekursiva (rCTE) måste du lägga till nyckelordet RECURSIVE
överst en gång även om inte alla CTE är rekursiva:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Manualen:
Om
RECURSIVE
är specificerad, tillåter enSELECT
delfråga för att referera till sig själv efter namn.
Djärv betoning min. Och ännu mer insiktsfull:
En annan effekt av
RECURSIVE
är detWITH
frågor behöver inte beställas :en fråga kan referera till en annan som finns längre fram i listan. (Men cirkulära referenser eller ömsesidig rekursion implementeras inte.)UtanRECURSIVE
,WITH
frågor kan bara referera till syskonWITH
frågor som finns tidigare iWITH
lista.
Djärv betoning min igen. Det betyder att ordningen WITH
satser är meningslösa när RECURSIVE
nyckelord har använts.
BTW, eftersom cte1
och cte2
i exemplet refereras inte i den yttre SELECT
och är vanliga SELECT
kommandona själva (inga bieffekter), de exekveras aldrig (såvida de inte hänvisas till i cte3
).