Je ervaart totale fan-out in de bovenstaande zoekopdracht.
Dit gebeurt omdat er
- een 1-1 of 1-N join tussen
aaa
&bbb
- er is een 1-N-join tussen
bbb
&ccc
De laatste join creëert M
duplicaten voor rijen die bestaan in bbb
als ze worden samengevoegd met M-rijen via de join to ccc
Om de fout op te lossen, splitst u de zoekopdracht op in twee CTE's en voegt u het resultaat samen.
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)
Om fan-outs te voorkomen, past u in het algemeen alleen geaggregeerde bewerkingen toe op de kolommen van de meest rechtse relatie in een reeks joins. Als je merkt dat je kolommen uit de middelste tabellen aggregeert, splits dan de query op zoals ik hierboven heb gedaan. Alleen de volgende functies zijn invariant over een fan out:COUNT DISTINCT
, MIN
, MAX