sql >> Base de Datos >  >> RDS >> PostgreSQL

Filas duplicadas de SQL con múltiples combinaciones a la izquierda

Estás experimentando un fanout agregado en la consulta anterior.

Esto sucede porque hay

  • una unión 1-1 o 1-N entre aaa &bbb
  • hay una unión 1-N entre bbb &ccc

La última unión crea M duplicados para filas que existen en bbb si se unen a M filas mediante la unión a ccc

Para corregir el error, divida la consulta en dos CTE y únase al 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)

En general, para evitar fan-outs, solo aplique operaciones agregadas a las columnas de la relación más a la derecha en una serie de uniones. Si encuentra que está agregando columnas de las tablas intermedias, divida la consulta como lo hice anteriormente. Solo las siguientes funciones son invariantes en un despliegue:COUNT DISTINCT , MIN , MAX