Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Data Berlebihan Apabila Menggabungkan Berbilang Panggilan `array_agg()` dalam Satu Pertanyaan SQL?
Menggabungkan Berbilang array_agg() Panggilan dalam Satu Pertanyaan
Dalam pertanyaan anda, anda menghadapi masalah di mana berbilang array_agg() panggilan kembali berlebihan data. Kehadiran baris pendua kerana gabungan berbilang membawa kepada hasil yang tidak diingini. Untuk menyelesaikan masalah ini, kita boleh meneroka beberapa pendekatan yang mengelakkan pendaraban baris dari awal lagi.
Penyelesaian 1: Mengagregatkan Dahulu, Menyertai Kemudian
Satu kaedah yang berkesan ialah mengagregatkan data dalam subqueries sebelum melakukan cantuman. Ini memastikan setiap rekod pekerja adalah unik, menghalang pendaraban baris. Pertanyaan yang diubah suai akan kelihatan seperti ini:
SELECT e.id, e.name, e.age, ad.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 -- PK covers whole row ) e JOIN workingdays wd ON wd.employeeid = e.id GROUP BY e.id, e.name, e.age;
Penyelesaian 2: Subqueries Berkorelasi / JOIN LATERAL
Pendekatan lain ialah menggunakan subqueries berkorelasi atau JOIN LATERAL dalam PostgreSQL 9.3 atau kemudian. Teknik ini membolehkan anda mendapatkan semula data agregat untuk setiap pekerja dalam pertanyaan utama. Pertanyaan yang diubah suai ialah:
Syarikat 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'; -- very selective
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'; -- very selective
Kesimpulan
Dengan melaksanakan pendekatan ini, anda boleh mengelakkan pendaraban baris dan memperoleh hasil yang diingini, iaitu susunan alamat dan susunan hari bekerja untuk setiap pekerja. Penyelesaian ini memastikan bahawa data diagregatkan dengan sewajarnya dan digabungkan dengan betul, menghapuskan keperluan untuk penapisan tambahan atau pasca pemprosesan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Data Berlebihan Apabila Menggabungkan Berbilang Panggilan `array_agg()` dalam Satu Pertanyaan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!