Anda mengalami fanout agregat dalam kueri di atas.
Hal ini terjadi karena ada
- penggabungan 1-1 atau 1-N antara
aaa
&bbb
- ada gabungan 1-N antara
bbb
&ccc
Gabung terakhir membuat M
duplikat untuk baris yang ada di bbb
jika mereka bergabung ke baris M melalui gabung ke ccc
Untuk memperbaiki kesalahan, bagi kueri menjadi dua CTE &gabungkan hasilnya.
WITH agg_bb AS (
SELECT aa.id, sum(bb.count)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
GROUP BY aa.id
)
, agg_cc AS (SELECT aa.id, count(DISTINCT cc.id)
FROM aaaa aa
LEFT JOIN bbbb bb ON bb.aa_id = aa.id
LEFT JOIN cccc cc ON cc.bb_id = bb.id
GROUP BY aa.id
)
SELECT * FROM agg_bb JOIN agg_cc USING (id)
Secara umum, untuk menghindari fan out, hanya terapkan operasi agregat ke kolom dari relasi paling kanan dalam serangkaian gabungan. Jika Anda menemukan Anda menggabungkan kolom dari tabel tengah, pisahkan kueri seperti yang telah saya lakukan di atas. Hanya fungsi berikut yang invarian di seluruh fan out:COUNT DISTINCT
, MIN
, MAX