No Postgres 9.3 ou posterior, normalmente é melhor usar
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;
Se a função
foo()
pode retornar nenhuma linha , essa é a forma segura, pois preserva todas as linhas à esquerda da junção, mesmo quando nenhuma linha é retornada à direita. Caso contrário, ou se querer para excluir linhas sem resultado da junção lateral, use:
CROSS JOIN LATERAL foo(sub.arr)
ou abreviação:
, foo(sub.arr)
Há uma menção explícita no manual.
A resposta relacionada de Craig (referenciada por Daniel) é atualizada de acordo:
- Como evitar várias avaliações de função com a sintaxe (func()).* em uma consulta SQL?