Gestion par PostgreSQL de plusieurs fonctions de retour d'ensemble dans les instructions SELECT : une analyse spécifique à la version
Le comportement de PostgreSQL lorsqu'il rencontre plusieurs fonctions renvoyant un ensemble dans une instruction SELECT
varie considérablement en fonction de la version de la base de données.
PostgreSQL 10 et versions ultérieures :
Dans les versions 10 et supérieures, ces fonctions s'exécutent de manière synchrone. La sortie est structurée de telle sorte que la fonction produisant le plus de lignes dicte le nombre total de lignes dans le jeu de résultats. Les sorties de fonction plus courtes sont complétées par des valeurs NULL
pour maintenir cet alignement, créant ainsi un résultat de type jointure croisée.
PostgreSQL 9.6 et versions antérieures :
Avant la version 9.6, le résultat diffère considérablement. Le nombre total de lignes générées est égal au plus petit commun multiple (LCM) du nombre de lignes de chaque fonction renvoyant un ensemble. Cela peut conduire à des résultats imprévisibles et potentiellement indésirables, en particulier lorsque le nombre de lignes ne partage aucun facteur commun.
Exemple illustratif :
Examinons la requête :
<code class="language-sql">SELECT generate_series(1, 3), generate_series(5, 7);</code>
Sortie PostgreSQL 10 :
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 NULL | NULL NULL | NULL NULL | NULL</code>
PostgreSQL 9.6 - Sortie :
<code> generate_series | generate_series -----------------+----------------- 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7 1 | 5 2 | 6 3 | 7</code>
Considérations clés :
CASE
et COALESCE
.LATERAL JOIN
avec ROWS FROM (...)
au lieu d'inclure directement plusieurs fonctions de retour d'ensemble dans la liste SELECT
.Documentation pertinente :
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!