I Postgres 9.3 eller nyere er det typisk bedst at bruge 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;
Hvis funktionen foo()
kan returnere ingen rækker , det er den sikre form, da den bevarer alle rækker til venstre for sammenføjningen, selv når ingen række vender tilbage til højre.
Ellers, eller hvis du vil for at udelukke rækker uden resultat fra sidesammenføjningen, brug:
CROSS JOIN LATERAL foo(sub.arr)
eller stenografien:
, foo(sub.arr)
Der er en eksplicit omtale i manualen.
Craigs relaterede svar (refereret af Daniel) er opdateret i overensstemmelse hermed:
- Hvordan undgår man flere funktionsevaler med (func()).*-syntaksen i en SQL-forespørgsel?