PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Doppelte SQL-Zeilen mit mehreren Linksverknüpfungen

In der obigen Abfrage tritt ein aggregiertes Fanout auf.

Dies geschieht, weil es

gibt
  • entweder ein 1-1 oder 1-N Join zwischen aaa &bbb
  • es gibt einen 1-N-Join zwischen bbb &ccc

Der letztere Join erstellt M Duplikate für Zeilen, die in bbb vorhanden sind wenn sie über den Join zu ccc mit M Zeilen verbunden werden

Um den Fehler zu beheben, teilen Sie die Abfrage in zwei CTEs auf und verbinden Sie das Ergebnis.

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)

Um Auffächerungen zu vermeiden, wenden Sie im Allgemeinen nur Aggregatoperationen auf die Spalten von der ganz rechten Relation in einer Reihe von Joins an. Wenn Sie feststellen, dass Sie Spalten aus den mittleren Tabellen aggregieren, teilen Sie die Abfrage wie oben beschrieben auf. Nur die folgenden Funktionen sind über einen Fanout unveränderlich:COUNT DISTINCT , MIN , MAX