Dans Postgres 9.3 ou version ultérieure, il est généralement préférable d'utiliser LEFT JOIN LATERAL ... ON true
:
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;
Si la fonction foo()
peut renvoyer aucune ligne , c'est la forme sûre car elle préserve toutes les lignes à gauche de la jointure, même lorsqu'aucune ligne n'est renvoyée à droite.
Sinon, ou si vous voulez pour exclure les lignes sans résultat de la jointure latérale, utilisez :
CROSS JOIN LATERAL foo(sub.arr)
ou le raccourci :
, foo(sub.arr)
Il y a une mention explicite dans le manuel.
La réponse connexe de Craig (référencée par Daniel) est mise à jour en conséquence :
- Comment éviter plusieurs évaluations de fonction avec la syntaxe (func()).* dans une requête SQL ?