Rumah > pangkalan data > tutorial mysql > Bagaimana untuk Mengelakkan Keputusan Tidak Dijangka daripada Pelbagai Panggilan `array_agg()` Bersarang dalam PostgreSQL?

Bagaimana untuk Mengelakkan Keputusan Tidak Dijangka daripada Pelbagai Panggilan `array_agg()` Bersarang dalam PostgreSQL?

Barbara Streisand
Lepaskan: 2025-01-03 01:17:37
asal
293 orang telah melayarinya

How to Avoid Unexpected Results from Multiple Nested `array_agg()` Calls in PostgreSQL?

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;
Salin selepas log masuk

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';
Salin selepas log masuk

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';
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan