Brug nøgleordet WITH
en gang på toppen. Hvis nogle af dine almindelige tabeludtryk (CTE) er rekursive (rCTE), skal du tilføje søgeordet RECURSIVE
øverst en gang også, selvom ikke alle CTE'er er rekursive:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Manualen:
Hvis RECURSIVE
er angivet, tillader det en SELECT
underforespørgsel for at henvise til sig selv ved navn.
Fed understregning min. Og endnu mere indsigtsfuldt:
En anden effekt af RECURSIVE
er det WITH
forespørgsler behøver ikke bestilles :en forespørgsel kan referere til en anden, der er senere på listen. (Cirkulære referencer eller gensidig rekursion er dog ikke implementeret.)Uden RECURSIVE
, WITH
forespørgsler kan kun henvise til søskende WITH
forespørgsler, der er tidligere i WITH
liste.
Fed betoning min igen. Det betyder, at rækkefølgen WITH
klausuler er meningsløse når RECURSIVE
nøgleord er blevet brugt.
BTW, da cte1
og cte2
i eksemplet er der ikke refereret i den ydre SELECT
og er almindelige SELECT
kommandoerne selv (ingen sideeffekter), de udføres aldrig (medmindre der henvises til cte3
).