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:
SeRECURSIVEfor especificado, ele permite aSELECTsubconsulta para fazer referência a si mesma por nome.
Minha ênfase em negrito. E ainda mais esclarecedor:
Outro efeito deRECURSIVEé queWITHas 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,WITHconsultas só podem fazer referência ao irmãoWITHconsultas anteriores noWITHLista.
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 ).