Memanggil Fungsi Pengembalian Set dengan Argumen Tatasusunan Berbilang Kali
Perbincangan ini berpusat di sekitar fungsi pengembalian set bernama foo yang boleh memproses tatasusunan data yang menggunakan parameter tertentu dan memberikan hasil yang mengandungi set baris dan lajur tambahan. Walaupun fungsi beroperasi dengan jayanya dengan satu set data, ia menghadapi cabaran apabila cuba memproses berbilang set data tanpa bergantung pada ID data untuk rujukan.
Pelbagai percubaan untuk mengubah suai sintaks, seperti menggunakan format berikut:
SELECT dataid, (foo(ARRAY_AGG(data)),1).* FROM dataset WHERE dataid = something -- only testing on 1 GROUP BY dataid
tidak berjaya, menyebabkan fungsi dipanggil berulang kali untuk setiap lajur.
Penyelesaian: Lateral Join
Dalam PostgreSQL versi 9.3 dan seterusnya, menggunakan binaan LEFT JOIN LATERAL biasanya menghasilkan hasil yang optimum:
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;
Sintaks ini memastikan bahawa semua baris ke sebelah kiri cantuman dikekalkan, walaupun fungsi foo tidak mengembalikan baris.
Jika foo sememangnya tidak boleh mengembalikan baris dan mengecualikan baris tersebut diingini, sintaks berikut boleh digunakan:
CROSS JOIN LATERAL foo(sub.arr)
atau versi ringkasnya:
, foo(sub.arr)
Pendekatan ini didokumenkan dalam PostgreSQL manual.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Panggil Fungsi Pengembalian Set dengan Cekap dengan Argumen Tatasusunan Berbilang Kali dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!