Heim >Datenbank >MySQL-Tutorial >Warum erzeugen mehrere Set-Return-Funktionen in einer SELECT-Klausel nicht immer einen Cross-Join in PostgreSQL?

Warum erzeugen mehrere Set-Return-Funktionen in einer SELECT-Klausel nicht immer einen Cross-Join in PostgreSQL?

Barbara Streisand
Barbara StreisandOriginal
2025-01-17 23:57:09126Durchsuche

Why Do Multiple Set-Returning Functions in a SELECT Clause Not Always Produce a Cross Join in PostgreSQL?

Unerwartetes Verhalten von PostgreSQL mit mehreren Set-Return-Funktionen in SELECT-Anweisungen

Das 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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn