I Postgres 9.3 eller senare är det vanligtvis bäst att använda 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;
Om funktionen foo()
kan returnera inga rader , det är den säkra formen eftersom den bevarar alla rader till vänster om sammanfogningen, även när ingen rad återförs till höger.
Annars, eller om du vill för att utesluta rader utan resultat från den laterala sammanfogningen, använd:
CROSS JOIN LATERAL foo(sub.arr)
eller stenografin:
, foo(sub.arr)
Det finns ett uttryckligt omnämnande i manualen.
Craigs relaterade svar (refererad av Daniel) uppdateras därefter:
- Hur undviker man flera funktionsevaler med syntaxen (func()).* i en SQL-fråga?