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 ).