Utilisation de LATERAL JOIN pour gérer plusieurs appels de fonction avec des arguments de tableau
Dans PostgreSQL, gestion de plusieurs appels à une fonction renvoyant un ensemble avec un tableau l’argumentation peut être difficile. Cela devient particulièrement évident lorsque la fonction opère sur un tableau de lignes et renvoie un ensemble de lignes avec une colonne supplémentaire.
Comprendre la limitation
L'approche standard consiste à passer le tableau en tant que paramètre unique de la fonction et en s'appuyant sur une requête ultérieure pour extraire les données pertinentes. Cependant, cette approche conduit souvent à plusieurs appels à la fonction, avec un appel pour chaque ligne du tableau.
La solution LATERAL JOIN
Pour remédier à cette limitation, PostgreSQL 9.3 et versions ultérieures ont introduit l'opérateur LATERAL JOIN. Cet opérateur permet de joindre des tables sur une condition évaluée ligne par ligne, éliminant ainsi le besoin de plusieurs appels de fonction.
La requête suivante démontre l'utilisation de LATERAL JOIN pour joindre un ensemble de fonctions :
SELECT sub.dataid, f.* FROM ( SELECT dataid, array_agg(data) AS arr FROM dataset WHERE dataid = something GROUP BY 1 ) sub LEFT JOIN LATERAL foo(sub.arr) f ON true;
La sous-requête crée un tableau de données pour chaque dataid et le joint à la fonction foo en utilisant LATERAL JOIN. Cela garantit que la fonction n'est appelée qu'une seule fois et que le résultat est joint aux données de la sous-requête.
Optimisation de la requête
Si la fonction foo() peut renvoyer non lignes, en utilisant LEFT JOIN LATERAL ... ON true préserve toutes les lignes à gauche de la jointure. Sinon, envisagez d'utiliser CROSS JOIN LATERAL foo(sub.arr) ou le raccourci foo(sub.arr) pour exclure les lignes sans résultats.
Cette approche évite non seulement plusieurs appels de fonction, mais améliore également les performances et simplifie les requêtes. , surtout lorsque vous travaillez avec de grands ensembles de données.
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!