Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Baris Pendua Apabila Menggunakan Agregat Tatasusunan Berbilang dalam Pertanyaan SQL?

Bagaimana untuk Mengelakkan Baris Pendua Apabila Menggunakan Agregat Tatasusunan Berbilang dalam Pertanyaan SQL?

Patricia Arquette
Patricia Arquetteasal
2024-12-30 07:34:09330semak imbas

How to Avoid Duplicate Rows When Using Multiple Array Aggregates in a SQL Query?

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!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn