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 ?

Comment puis-je appeler efficacement une fonction de retour d'ensemble avec un argument de tableau plusieurs fois dans PostgreSQL ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-26 12:32:10896parcourir

How Can I Efficiently Call a Set-Returning Function with an Array Argument Multiple Times in 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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn