आप उपरोक्त क्वेरी में कुल प्रशंसक अनुभव कर रहे हैं।
ऐसा इसलिए होता है क्योंकि
- या तो 1-1 या 1-N
aaa
. के बीच जुड़ते हैं &bbb
bbb
. के बीच एक 1-N जॉइन है &ccc
बाद वाला जुड़ाव M
. बनाता है bbb
. में मौजूद पंक्तियों के लिए डुप्लीकेट अगर वे ccc
. में शामिल होने के माध्यम से M पंक्तियों में शामिल हो गए हैं
त्रुटि को ठीक करने के लिए, क्वेरी को दो सीटीई में विभाजित करें और परिणाम में शामिल हों।
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