Hier geht es nicht um Unnest als solches, sondern um PostgreSQLs sehr seltsamen Umgang mit mehreren Set-Returning-Funktionen im SELECT
aufführen. Satzrückgabefunktionen in SELECT
sind nicht Teil des ANSI-SQL-Standards.
Sie werden feststellen, dass das Verhalten mit LATERAL
viel gesünder ist Abfragen, die der Verwendung einer Set-Returning-Funktion in FROM
vorgezogen werden sollten so viel wie möglich:
select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;
z. B.
regress=> select a, b FROM unnest(array[1,2]) a, LATERAL unnest(array[1,2,3]) b;
a | b
---+---
1 | 1
1 | 2
1 | 3
2 | 1
2 | 2
2 | 3
(6 rows)
Das einzige Mal, dass ich noch mehrere Set-Returning-Funktionen in SELECT
verwende ist, wenn ich Werte von Funktionen paaren möchte, die beide die gleiche Anzahl von Zeilen zurückgeben. Die Notwendigkeit dafür wird in 9.4 verschwinden, mit Multi-Argument unnest
und mit Unterstützung für WITH ORDINALITY
.