Você está enfrentando fanout agregado na consulta acima.
Isso acontece porque existe
- uma junção 1-1 ou 1-N entre
aaa
&bbb
- há uma junção 1-N entre
bbb
&ccc
A última junção cria
M
duplicatas para linhas que existem em bbb
se eles estiverem unidos a M linhas por meio da junção a ccc
Para corrigir o erro, divida a consulta em dois CTEs e junte o resultado.
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)
Em geral, para evitar fan outs, aplique apenas operações de agregação às colunas da relação mais à direita em uma série de junções. Se você achar que está agregando colunas das tabelas do meio, divida a consulta como fiz acima. Apenas as funções a seguir são invariáveis em uma distribuição:
COUNT DISTINCT
, MIN
, MAX