PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Righe duplicate SQL con più join a sinistra

Stai riscontrando un fanout aggregato nella query precedente.

Questo accade perché c'è

  • un join 1-1 o 1-N tra aaa &bbb
  • c'è un join 1-N tra bbb &ccc

Quest'ultimo join crea M duplicati per le righe che esistono in bbb se sono uniti a M righe tramite l'unione a ccc

Per correggere l'errore, dividi la query in due CTE e unisci il risultato.

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)

In generale, per evitare fan out, applicare solo operazioni aggregate alle colonne dalla relazione più a destra in una serie di join. Se trovi che stai aggregando colonne dalle tabelle centrali, dividi la query come ho fatto sopra. Solo le seguenti funzioni sono invarianti in un fan out:COUNT DISTINCT , MIN , MAX