PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Mehrere CTE in einer einzigen Abfrage

Verwenden Sie das Schlüsselwort WITH einmal oben. Wenn einer Ihrer Common Table Expressions (CTE) rekursiv ist (rCTE), müssen Sie das Schlüsselwort RECURSIVE hinzufügen ganz oben einmal auch, auch wenn nicht alle CTEs rekursiv sind:

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

Das Handbuch:

Wenn RECURSIVE angegeben ist, erlaubt ein SELECT Unterabfrage, um sich selbst anhand des Namens zu referenzieren.

Fette Hervorhebung von mir. Und, noch aufschlussreicher:

Ein weiterer Effekt von RECURSIVE ist das WITH Abfragen müssen nicht bestellt werden :Eine Abfrage kann auf eine andere verweisen, die später in der Liste steht. (Zirkelverweise oder gegenseitige Rekursion sind jedoch nicht implementiert.)Ohne RECURSIVE , WITH Abfragen können nur auf Geschwister WITH verweisen Abfragen, die früher im WITH stehen Liste.

Fette Betonung wieder von mir. Das bedeutet, dass die Reihenfolge WITH Klauseln ist sinnlos wenn der RECURSIVE Schlüsselwort wurde verwendet.

Übrigens, seit cte1 und cte2 im Beispiel werden nicht im äußeren SELECT referenziert und sind einfach SELECT Befehle selbst (keine Nebenwirkungen), werden sie nie ausgeführt (sofern nicht in cte3 darauf verwiesen wird ).