上記のクエリで全体的なファンアウトが発生しています。
これは、
があるために発生します-
aaa
間の1-1または1-N結合 &bbb
-
bbb
の間には1-N結合があります &ccc
後者の結合はM
を作成します bbb
に存在する行の重複 ccc
への結合を介してM行に結合されている場合
エラーを修正するには、クエリを2つのCTEに分割し、結果を結合します。
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)
一般に、ファンアウトを回避するには、一連の結合の右端の関係から列にのみ集計操作を適用します。中央のテーブルから列を集約していることがわかった場合は、上記のようにクエリを分割します。ファンアウト全体で不変な関数は次の関数のみです:COUNT DISTINCT
、MIN
、MAX