sql >> Base de Datos >  >> RDS >> PostgreSQL

Múltiples CTE en una sola consulta

Usa la palabra clave WITH una vez en la cima. Si alguna de sus expresiones de tabla común (CTE) es recursiva (rCTE), debe agregar la palabra clave RECURSIVE en la parte superior una vez además, aunque no todos los CTE sean recursivos:

WITH RECURSIVE
  cte1 AS (...)         -- can still be non-recursive
, cte2 AS (SELECT ...
           UNION ALL
           SELECT ...)  -- recursive term
, cte3 AS (...)
SELECT ... FROM cte3 WHERE ...

El manual:

Si RECURSIVE se especifica, permite un SELECT subconsulta para referenciarse a sí misma por su nombre.

Énfasis en negrita mío. Y, aún más perspicaz:

Otro efecto de RECURSIVE es que WITH no es necesario ordenar las consultas :una consulta puede hacer referencia a otra que está más adelante en la lista. (Sin embargo, las referencias circulares o la recursividad mutua no están implementadas). Sin RECURSIVE , WITH las consultas solo pueden hacer referencia al hermano WITH consultas que están antes en WITH lista.

Énfasis en negrita mío de nuevo. Lo que significa que el orden de WITH cláusulas es sin sentido cuando el RECURSIVE se ha utilizado la palabra clave.

Por cierto, desde cte1 y cte2 en el ejemplo no se hace referencia en el exterior SELECT y son simples SELECT comandos en sí mismos (sin efectos colaterales), nunca se ejecutan (a menos que se haga referencia en cte3 ).