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