PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Più CTE in un'unica query

Usa la parola chiave WITH una volta in cima. Se una delle tue Common Table Expressions (CTE) è ricorsiva (rCTE) devi aggiungere la parola chiave RECURSIVE in alto una volta inoltre, anche se non tutti i CTE sono ricorsivi:

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

Il manuale:

Se RECURSIVE è specificato, consente un SELECT sottoquery per fare riferimento a se stessa per nome.

Enfasi in grassetto mio. E, ancora più perspicace:

Un altro effetto di RECURSIVE è quello WITH le query non devono essere ordinate :una query può fare riferimento a un'altra che è più avanti nell'elenco. (Tuttavia, i riferimenti circolari o la ricorsione reciproca non sono implementati.) Senza RECURSIVE , WITH le query possono fare riferimento solo al fratello WITH query che sono precedenti in WITH elenco.

Enfasi audace la mia di nuovo. Significa che l'ordine di WITH clausole è privo di significato quando il RECURSIVE è stata utilizzata la parola chiave.

A proposito, poiché cte1 e cte2 nell'esempio non sono referenziati nel SELECT esterno e sono semplici SELECT comandi stessi (nessun effetto collaterale), non vengono mai eseguiti (a meno che non sia indicato in cte3 ).