PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Vários CTE em uma única consulta


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:

Se RECURSIVE for especificado, ele permite a SELECT subconsulta para fazer referência a si mesma por nome.

Minha ênfase em negrito. E ainda mais esclarecedor:

Outro efeito de RECURSIVE é que WITH 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.) Sem RECURSIVE , WITH consultas só podem fazer referência ao irmão WITH consultas anteriores no WITH 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 ).