In Postgres 9.3 o versioni successive, in genere è meglio utilizzare 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 la funzione foo()
può restituire nessuna riga , questo è il modulo sicuro in quanto conserva tutte le righe a sinistra del join, anche quando nessuna riga viene restituita a destra.
Altrimenti, o se vuoi per escludere righe senza risultato dall'unione laterale, utilizzare:
CROSS JOIN LATERAL foo(sub.arr)
o la stenografia:
, foo(sub.arr)
C'è una menzione esplicita nel manuale.
La risposta correlata di Craig (a cui fa riferimento Daniel) viene aggiornata di conseguenza:
- Come evitare più valutazioni di funzioni con la sintassi (func()).* in una query SQL?