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 ).