Давам своя отговор, защото имам сериозни съмнения относно другите отговори. Трябва да внимавате относно изискванията за филтъра. Не забравяйте, че клаузата where се изпълнява след вашите присъединявания . Така че, ако има някакви изисквания за филтър в клаузата where които се отнасят до не-външната съединена таблица, вие (при много обстоятелства) сте анулирали вашето външно съединяване. Така че, като вземем вашия sql, изглежда най-простото решение е или да използвате правилното съединение, или да преместите имената на таблиците по подходящ начин и след това да преместите условията на филтъра от клаузата where в клаузата за присъединяване.
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 демонстриране на филтриране на клаузата за присъединяване спрямо клаузата where.