SELECT
-AnweisungenDas Problem:
Die Verwendung mehrerer Mengen zurückgebender Funktionen innerhalb der Klausel einer SELECT
-Anweisung kann zu unerwarteten Ergebnissen führen, insbesondere wenn die Mengen ungleiche Längen haben. Während generate_series(1, 3)
und generate_series(5, 7)
einen Cross-Join erzeugen, ist dies bei generate_series(1, 2)
und generate_series(1, 4)
nicht der Fall. Diese Inkonsistenz ist rätselhaft.
Die Erklärung:
Der Schlüssel liegt in den Versionsunterschieden von PostgreSQL. PostgreSQL 10 und spätere Versionen handhaben dies anders als frühere Versionen (9.6 und früher).
PostgreSQL 10 und höher:
PostgreSQL 10 und nachfolgende Versionen behandeln mehrere Set-Return-Funktionen in der SELECT
-Liste ähnlich wie eine LATERAL ROWS FROM(...)
-Klausel. Die Funktionen werden synchron ausgeführt und die kürzeren Sätze werden mit NULL
-Werten aufgefüllt, um der Länge des längsten Satzes zu entsprechen. Dadurch wird eine vollständige Kreuzverbindung gewährleistet. Zum Beispiel:
<code>row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 NULL | 13 | 23 NULL | NULL | 24</code>
PostgreSQL 9.6 und früher:
In älteren Versionen (9.6 und früher) entsprach die Zeilenanzahl der Ergebnismenge dem kleinsten gemeinsamen Vielfachen (LCM) der Zeilenanzahl der einzelnen Funktionen. Ein Cross-Join kam nur dann vor, wenn die eingestellten Größen keinen gemeinsamen Teiler hatten. Bei Verwendung desselben Beispiels wäre die Ausgabe:
<code>row2 | row3 | row4 -----+------+----- 1 | 11 | 21 2 | 12 | 22 1 | 13 | 23 2 | 11 | 24 1 | 12 | 21 2 | 13 | 22 1 | 11 | 23 2 | 12 | 24 1 | 13 | 21 2 | 11 | 22 1 | 12 | 23 2 | 13 | 24</code>
Best Practices:
Um unerwartete Ergebnisse zu vermeiden, ist es am besten, LATERAL
-Joins oder Unterabfragen zu verwenden, anstatt mehrere Mengen zurückgebende Funktionen direkt in der SELECT
-Liste zu platzieren. Dies sorgt für eine klarere Kontrolle und vorhersehbares Verhalten.
Weitere Details und zugehörige Informationen finden Sie in der offiziellen PostgreSQL-Dokumentation:
Das obige ist der detaillierte Inhalt vonWarum erzeugen mehrere Set-Return-Funktionen in einer SELECT-Klausel nicht immer einen Cross-Join in PostgreSQL?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!