PostgreSQLs Umgang mit mehreren Set-Return-Funktionen in SELECT-Anweisungen: Eine versionspezifische Analyse
Das Verhalten von PostgreSQL bei der Begegnung mit mehreren Set-Return-Funktionen innerhalb einer SELECT
-Anweisung variiert erheblich je nach Datenbankversion.
PostgreSQL 10 und höher:
In den Versionen 10 und höher werden diese Funktionen synchron ausgeführt. Die Ausgabe ist so strukturiert, dass die Funktion, die die meisten Zeilen erzeugt, die Gesamtzahl der Zeilen im Ergebnissatz vorgibt. Kürzere Funktionsausgaben werden mit NULL
-Werten aufgefüllt, um diese Ausrichtung beizubehalten, wodurch effektiv ein Cross-Join-ähnliches Ergebnis entsteht.
PostgreSQL 9.6 und früher:
Vor Version 9.6 unterscheidet sich das Ergebnis erheblich. Die Gesamtzahl der generierten Zeilen entspricht dem kleinsten gemeinsamen Vielfachen (LCM) der Zeilenanzahl aus jeder satzrückgebenden Funktion. Dies kann zu unvorhersehbaren und möglicherweise unerwünschten Ergebnissen führen, insbesondere wenn die Zeilenanzahlen keine gemeinsamen Faktoren aufweisen.
Anschauliches Beispiel:
Lassen Sie uns die Abfrage untersuchen:
<code class="language-sql">SELECT generate_series(1, 3), generate_series(5, 7);</code>
PostgreSQL 10-Ausgabe:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 NULL | NULL NULL | NULL NULL | NULL</code>
PostgreSQL 9.6- Ausgabe:
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7</code>
Wichtige Überlegungen:
CASE
- und COALESCE
-Ausdrücken.LATERAL JOIN
mit ROWS FROM (...)
zu verwenden, anstatt mehrere Satzrückgabefunktionen direkt in die SELECT
-Liste aufzunehmen.Relevante Dokumentation:
Das obige ist der detaillierte Inhalt vonWie verhalten sich mehrere Set-Return-Funktionen in der SELECT-Klausel von PostgreSQL in verschiedenen Versionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!