Du upplever ett samlat fanout i ovanstående fråga.
Detta händer eftersom det finns
- antingen en 1-1- eller 1-N-koppling mellan
aaa
&bbb
- det finns en 1-N-koppling mellan
bbb
&ccc
Den senare kopplingen skapar M
dubbletter för rader som finns i bbb
om de är anslutna till M rader via kopplingen till ccc
För att åtgärda felet, dela upp frågan i två CTE:er och anslut resultatet.
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)
I allmänhet, för att undvika fan-outs, tillämpa endast aggregerade operationer på kolumnerna från relationen längst till höger i en serie av joins. Om du upptäcker att du aggregerar kolumner från de mellersta tabellerna, dela upp frågan som jag har gjort ovan. Endast följande funktioner är invarianta över en fläkt out:COUNT DISTINCT
, MIN
, MAX