Use a palavra-chave
WITH
uma vez no topo. Se alguma de suas Expressões de Tabela Comum (CTE) for recursiva (rCTE), você deverá adicionar a palavra-chave RECURSIVE
no topo uma vez também, mesmo que nem todos os CTEs sejam recursivos:WITH RECURSIVE
cte1 AS (...) -- can still be non-recursive
, cte2 AS (SELECT ...
UNION ALL
SELECT ...) -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...
O manual:
SeRECURSIVE
for especificado, ele permite aSELECT
subconsulta para fazer referência a si mesma por nome.
Minha ênfase em negrito. E ainda mais esclarecedor:
Outro efeito deRECURSIVE
é queWITH
as consultas não precisam ser ordenadas :uma consulta pode fazer referência a outra que está mais adiante na lista. (No entanto, referências circulares ou recursão mútua não são implementadas.) SemRECURSIVE
,WITH
consultas só podem fazer referência ao irmãoWITH
consultas anteriores noWITH
Lista.
A ênfase em negrito é minha novamente. O que significa que a ordem de
WITH
cláusulas é sem sentido quando o RECURSIVE
palavra-chave foi usada. BTW, desde
cte1
e cte2
no exemplo não são referenciados no SELECT
externo e são simples SELECT
comandos em si (sem efeitos colaterais), eles nunca são executados (a menos que sejam referenciados em cte3
).