Elakkan Berbilang Agregat Bersarang dalam Pertanyaan PostgreSQL
Panggilan berbilang array_agg() dalam satu pertanyaan boleh menghasilkan hasil yang tidak dijangka, seperti yang dilihat dalam contoh disediakan. Isu ini timbul daripada penggabungan jadual dengan berbilang baris, menghasilkan produk Cartesian dengan berkesan. Untuk membetulkannya, pertimbangkan strategi berikut:
Agregat Dahulu, Sertai Kemudian
Agregat data daripada setiap jadual secara berasingan dalam subkueri sebelum menyertainya. Ini memastikan anda mengagregatkan satu set baris yang unik:
SELECT e.id, e.name, e.age, e.streets, array_agg(wd.day) AS days FROM ( SELECT e.id, e.name, e.age, array_agg(ad.street) AS streets FROM employees e JOIN address ad ON ad.employeeid = e.id GROUP BY e.id ) e JOIN workingdays wd ON wd.employeeid = e.id GROUP BY e.id, e.name, e.age;
Subkueri Berkaitan atau JOIN LATERAL
Gunakan subquery berkorelasi atau JOIN LATERAL untuk mengagregatkan data bagi setiap baris secara individu, membolehkan untuk terpilih penapis:
Subkueri Berkaitan:
SELECT name, age , (SELECT array_agg(street) FROM address WHERE employeeid = e.id) AS streets , (SELECT array_agg(day) FROM workingdays WHERE employeeid = e.id) AS days FROM employees e WHERE e.namer = 'peter';
SERTAI LATERAL:
SELECT e.name, e.age, a.streets, w.days FROM employees e LEFT JOIN LATERAL ( SELECT array_agg(street) AS streets FROM address WHERE employeeid = e.id GROUP BY 1 ) a ON true LEFT JOIN LATERAL ( SELECT array_agg(day) AS days FROM workingdays WHERE employeeid = e.id GROUP BY 1 ) w ON true WHERE e.name = 'peter';
Kaedah ini menghalang pertindihan baris yang tidak perlu dan berikan hasil pengagregatan tatasusunan yang diingini.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Keputusan Tidak Dijangka daripada Pelbagai Panggilan `array_agg()` Bersarang dalam PostgreSQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!