Используйте ключевое слово WITH
раз сверху и, если любой из ваших общих табличных выражений (КТР) являются рекурсивными (РКТО) вы должны добавить ключевое слово 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 ...
Quoting the manual:
Если RECURSIVE
указано, что все ows a SELECT
Подзапрос к ссылку сам по имени.
Смелый акцент мой. И даже более проницательны:
Другой эффект RECURSIVE
что WITH
запросы не должны быть заказаны: запрос может ссылаться на другой, который позже в списке. (Тем не менее, циклических ссылки, или взаимная рекурсия, не выполняется.) Без RECURSIVE
, WITH
запросов могут ссылаться только на двойники WITH
запросов, которые ранее в WITH
списке.
Смелый акцент мой снова. Это означает, что порядок статей WITH
равен бессмысленным, когда было использовано ключевое слово RECURSIVE
.
BTW, так как cte1
и cte2
не упоминается в наружной SELECT
и просты SELECT
команд сами (без залога эффектов), они никогда не выполняются (если не упоминаются в cte3
).
Название CTE - это идентификатор_идентификатора. Идентификаторы не должны быть заключены в одинарные кавычки. 'WITH 'cte1'' недействителен (как, например,' from foobar as' bla'') –