मैं अपना उत्तर इसलिए दे रहा हूं क्योंकि मुझे अन्य उत्तरों के बारे में महत्वपूर्ण संदेह है। आपको फ़िल्टर आवश्यकताओं के बारे में सावधान रहना होगा। याद रखें, जहां खंड आपके शामिल होने के बाद चलता है . इसलिए यदि कोई फ़िल्टर आवश्यकताएँ हैं कहाँ खंड में जो गैर-बाहरी शामिल तालिका को संदर्भित करता है, आपने (कई परिस्थितियों में) अपने बाहरी जुड़ाव को रद्द कर दिया है। तो अपना sql लेते हुए, ऐसा लगता है कि सबसे सरल उपाय यह है कि या तो उचित जॉइन का उपयोग करें या टेबल नामों को उचित रूप से स्थानांतरित करें, और फिर फ़िल्टर शर्तों को जहां क्लॉज से बाहर और जॉइन क्लॉज में ले जाएं।
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON
f.downloadtimeid = d.id
AND f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
एक और तरीका जो मुझे लगता है कि समकक्ष होना चाहिए, वह है
SELECT f.faultcode, f.downloadtimeid, d.downloadtime, count(*) as faultcount
FROM download_time d
RIGHT OUTER JOIN fs_fault f ON
f.downloadtimeid = d.id
AND d.downloadtime BETWEEN '04/11/2011' AND '05/01/2012')
AND d.bunoid = 166501
WHERE
f.faultcode IN (1000,1100)
AND f.statusid IN(2, 4)
GROUP BY d.bunoid, f.downloadtimeid, d.downloadtime, f.faultcode
चूंकि यह कड़ाई से मायने नहीं रखता है कि fs_fault पर फ़िल्टर की आवश्यकताएँ कहाँ हैं। (और आपका SQL इंजन इसे वैसे भी बदल देगा)।
संपादित करें:यहाँ एक SQLFiddle है जॉइन क्लॉज बनाम जहां क्लॉज पर फ़िल्टरिंग का प्रदर्शन।