Използвайте ключовата дума 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
).