Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Baris Pendua Apabila Menggunakan Agregat Tatasusunan Berbilang dalam Pertanyaan SQL?
Elakkan Berbilang Agregat Tatasusunan dalam Pertanyaan
Dalam pertanyaan anda, anda cuba menggunakan berbilang fungsi array_agg() dalam satu pertanyaan untuk mendapatkan semula tatasusunan daripada jadual yang berbeza. Walau bagaimanapun, pendekatan ini membawa kepada baris pendua dan hasil herot.
Isunya
Apabila anda melaksanakan berbilang gabungan dan fungsi agregat, set hasil boleh dibesarkan dengan pendua. Dalam kes anda, menyertai jadual alamat dan hari bekerja menghasilkan berbilang baris untuk setiap pekerja, menghasilkan entri pendua dalam tatasusunan terkumpul.
Penyelesaian: Pengagregatan dan Gabungan Berasingan
Untuk menyelesaikan isu ini, adalah disyorkan untuk memisahkan operasi pengagregatan daripada proses gabungan. Pertimbangkan pendekatan berikut:
Agregat Dahulu, Sertai Kemudian:
Mula-mula, agregat data daripada setiap jadual secara berasingan menggunakan subkueri. Kemudian, sertai hasil agregat berdasarkan kunci utama atau lajur biasa:
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:
Untuk penapisan data terpilih, pertimbangkan menggunakan subquery berkorelasi atau join LATERAL dalam PostgreSQL:
Berkait Subqueries:
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 (PostgreSQL 9.3 atau lebih baru):
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';
Pendekatan ini memastikan tatasusunan agregat dikaitkan dengan betul dengan pekerja yang sepadan, memberikan hasil yang diharapkan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Baris Pendua Apabila Menggunakan Agregat Tatasusunan Berbilang dalam Pertanyaan SQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!