Rumah >pangkalan data >tutorial mysql >Bagaimana untuk Mengelakkan Data Berlebihan Apabila Menggabungkan Berbilang Panggilan `array_agg()` dalam Satu Pertanyaan SQL?

Bagaimana untuk Mengelakkan Data Berlebihan Apabila Menggabungkan Berbilang Panggilan `array_agg()` dalam Satu Pertanyaan SQL?

Linda Hamilton
Linda Hamiltonasal
2024-12-29 13:56:23696semak imbas

How to Avoid Redundant Data When Combining Multiple `array_agg()` Calls in a Single SQL Query?

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!

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