En Postgres 9.3 o posterior, normalmente es mejor 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;
Si la función foo()
puede devolver sin filas , esa es la forma segura ya que conserva todas las filas a la izquierda de la combinación, incluso cuando no se devuelve ninguna fila a la derecha.
Si no, o si quieres para excluir filas sin resultado de la unión lateral, use:
CROSS JOIN LATERAL foo(sub.arr)
o la abreviatura:
, foo(sub.arr)
Hay una mención explícita en el manual.
La respuesta relacionada de Craig (a la que hace referencia Daniel) se actualiza en consecuencia:
- ¿Cómo evitar múltiples evaluaciones de funciones con la sintaxis (func()).* en una consulta SQL?