Di Postgres 9.3 atau yang lebih baru, biasanya yang terbaik adalah menggunakan 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;
Jika fungsi foo()
dapat mengembalikan tanpa baris , itu bentuk aman karena mempertahankan semua baris di sebelah kiri gabungan, meskipun tidak ada baris yang dikembalikan ke kanan.
Lain, atau jika Anda mau untuk mengecualikan baris tanpa hasil dari gabungan lateral, gunakan:
CROSS JOIN LATERAL foo(sub.arr)
atau singkatan:
, foo(sub.arr)
Ada penyebutan eksplisit dalam manual.
Jawaban terkait Craig (direferensikan oleh Daniel) diperbarui sesuai:
- Bagaimana cara menghindari beberapa evaluasi fungsi dengan sintaks (func()).* dalam kueri SQL?