Gebruik het sleutelwoord WITH
eenmaal op de top. Als een van uw Common Table Expressions (CTE) recursief (rCTE) is, moet u het trefwoord RECURSIVE
toevoegen bovenaan eenmaal ook, zelfs als niet alle CTE's recursief zijn:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
De handleiding:
Als RECURSIVE
is opgegeven, toestaat een SELECT
subquery om zichzelf op naam te verwijzen.
Vetgedrukte nadruk van mij. En, nog meer inzichtelijk:
Een ander effect van RECURSIVE
is dat WITH
zoekopdrachten hoeven niet te worden besteld :een query kan verwijzen naar een andere die later in de lijst staat. (Cirkelverwijzingen of wederzijdse recursie zijn echter niet geïmplementeerd.) Zonder RECURSIVE
, WITH
zoekopdrachten kunnen alleen verwijzen naar broer of zus WITH
zoekopdrachten die eerder in de WITH
. staan lijst.
Vetgedrukte nadruk nogmaals van mij. Dit betekent dat de volgorde van WITH
clausules is zinloos wanneer de RECURSIVE
sleutelwoord is gebruikt.
Trouwens, sinds cte1
en cte2
in het voorbeeld wordt niet verwezen in de buitenste SELECT
en zijn gewoon SELECT
commando's zelf (geen neveneffecten), ze worden nooit uitgevoerd (tenzij ernaar wordt verwezen in cte3
).