Използвайте ключовата дума WITH веднъж на върха. Ако някой от вашите общи таблични изрази (CTE) е рекурсивен (rCTE), трябва да добавите ключовата дума RECURSIVE в горната част веднъж също така, дори ако не всички CTE са рекурсивни:
WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
Ръководството:
Ако
RECURSIVEе посочено, топозволява aSELECTподзаявка за препратка към себе си по име.
Удебелен акцент мой. И още по-проницателно:
Друг ефект на
RECURSIVEтова еWITHне е необходимо да се поръчват заявките :заявката може да препраща към друга, която е по-късно в списъка. (Въпреки това, кръгови препратки или взаимна рекурсия не се прилагат.) БезRECURSIVE,WITHзаявките могат да препращат самоWITHзаявки, които са по-рано вWITHсписък.
Удебелен акцент отново мой. Това означава, че редът на WITH клаузи е безсмислено когато RECURSIVE ключовата дума е използвана.
BTW, тъй като cte1 и cte2 в примера не са посочени във външния SELECT и са обикновени SELECT самите команди (без странични ефекти), те никога не се изпълняват (освен ако не са посочени в cte3 ).