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 enSELECTdelfrå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 detWITHfrå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,WITHfrågor kan bara referera till syskonWITHfrågor som finns tidigare iWITHlista.
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 ).