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
Freigeben: 2025-01-17 23:57:09
Original
124 Leute haben es durchsucht

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>
Nach dem Login kopieren

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>
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage