PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एकाधिक बाएं जुड़ने वाली SQL डुप्लिकेट पंक्तियाँ

आप उपरोक्त क्वेरी में कुल प्रशंसक अनुभव कर रहे हैं।

ऐसा इसलिए होता है क्योंकि

  • या तो 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




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Laravel 8 . में 3 या अधिक तालिकाओं में बाहरी जुड़ाव

  2. PostgreSQL में ऑर्डिनल नंबर कैसे बनाएं

  3. जावा का उपयोग करके PostgreSQL में SQL के लिए मनमाने ढंग से तारों से सुरक्षित रूप से कैसे बचें?

  4. PostgreSQL में डेटा के साथ भाषा का पता लगाना

  5. सीक्वेल में संघ इरादा के अनुसार काम नहीं कर रहे हैं