Ответ 1
Используйте ключевое слово 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
могут ссылаться только на siblingWITH
которые ранее были в спискеWITH
.
Смелый акцент мой снова. Это означает, что порядок предложений WITH
не имеет смысла при использовании ключевого слова RECURSIVE
.
BTW, поскольку cte1
и cte2
не ссылаются во внешнем SELECT
и являются просто командами SELECT
(без побочных эффектов), они никогда не исполняются (если не указано в cte3
).