PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Linhas duplicadas SQL com várias junções à esquerda


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