आपका पहला बाहरी जुड़ाव , जैसा कि अपेक्षित था, उत्पादन करता है:
| REASON | MONTH | ------------------- | A | May | | A | May | | A | July | | A | June | | B | May | | B | June | | D | (null) |
हालाँकि, क्योंकि बाहरी जुड़ाव परिणाम उत्पन्न करते हैं यदि शामिल होने की स्थिति संतुष्ट होती है कम से कम एक बार (और केवल NULL introduce का परिचय दें रिकॉर्ड अगर हालत कभी नहीं . है संतुष्ट), आपका दूसरा बाहरी जुड़ाव
तो नहीं (B, July) . के लिए एक रिकॉर्ड तैयार करें; यह Reason = 'D' . को भी गिरा देता है पूरी तरह से, क्योंकि शामिल होने की शर्त पूरी नहीं हुई है (और सभी तीन महीने कहीं और संतुष्ट हैं):
| REASON | MONTH | ------------------ | A | May | | A | May | | B | May | | A | June | | B | June | | A | July |
जबकि आप कर सकते थे Reason = 'D' . के नुकसान को हल करें जोड़कर
OR a.Month IS NULL आपकी शामिल होने की स्थिति में, आप अभी भी (B, July) . का उत्पादन नहीं करेंगे . इसके बजाय, क्योंकि आप (Reason, Month) . की प्रत्येक जोड़ी प्राप्त करना चाहते हैं , आपको CROSS JOIN आपका साकार हुआ Reasons आपके भौतिक Months . के साथ तालिका तालिका:
SELECT Reason, Month
FROM
(
SELECT 'A' AS Reason
UNION ALL SELECT 'B'
UNION ALL SELECT 'D'
) Reasons CROSS JOIN (
SELECT 'May' AS Month
UNION ALL SELECT 'June'
UNION ALL SELECT 'July'
) Months
| REASON | MONTH | ------------------ | A | May | | B | May | | D | May | | A | June | | B | June | | D | June | | A | July | | B | July | | D | July |
इसे sqlfiddle पर देखें ।
फिर आपको केवल अपने अंतर्निहित डेटा के साथ परिणाम में बाहरी रूप से शामिल होने की आवश्यकता है:
SELECT Reason, Month, SUM(Down_time) downtime
FROM
(
SELECT 'A' AS Reason
UNION ALL SELECT 'B'
UNION ALL SELECT 'D'
) Reasons CROSS JOIN (
SELECT 'May' AS Month
UNION ALL SELECT 'June'
UNION ALL SELECT 'July'
) Months
LEFT JOIN tabledown USING (Reason, Month)
GROUP BY Reason, Month
| REASON | MONTH | DOWNTIME | ----------------------------- | A | July | 3 | | A | June | 8 | | A | May | 7 | | B | July | (null) | | B | June | 6 | | B | May | 5 | | D | July | (null) | | D | June | (null) | | D | May | (null) |
इसे sqlfiddle पर देखें ।