Maison >base de données >tutoriel mysql >Comment puis-je appeler efficacement une fonction de retour d'ensemble avec un argument de tableau plusieurs fois dans PostgreSQL ?
Appel d'une fonction de retour d'ensemble avec un argument de tableau plusieurs fois
Cette discussion est centrée sur une fonction de retour d'ensemble nommée foo qui peut traiter un tableau de données utilisant un paramètre spécifique et fournit un résultat contenant un ensemble de lignes et une colonne supplémentaire. Bien que la fonction fonctionne avec succès avec un seul ensemble de données, elle rencontre des difficultés lorsqu'elle tente de traiter plusieurs ensembles de données sans s'appuyer sur un ID de données pour le référencement.
Diverses tentatives de modification de la syntaxe, telles que l'utilisation du format suivant :
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
ont échoué, ce qui a entraîné l'appel répété de la fonction pour chaque colonne.
Solution : latérale Join
Dans PostgreSQL versions 9.3 et ultérieures, l'utilisation d'une construction LEFT JOIN LATERAL donne généralement des résultats optimaux :
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;
Cette syntaxe garantit que toutes les lignes à la gauche de la jointure est conservée, même si la fonction foo ne renvoie aucune ligne.
Si foo peut effectivement ne renvoie aucune ligne et que l'exclusion de ces lignes est souhaitée, la syntaxe suivante peut être utilisée :
CROSS JOIN LATERAL foo(sub.arr)
ou sa version abrégée :
, foo(sub.arr)
Cette approche est documentée dans le manuel PostgreSQL.
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!