Odpovídám, protože o ostatních odpovědích značně pochybuji. Musíte být opatrní ohledně požadavků na filtr. Pamatujte, že klauzule where běží po vašich spojeních . Pokud tedy existují nějaké požadavky na filtr v klauzuli where které odkazují na tabulku bez vnějšího spojení, jste (v mnoha případech) zrušili své vnější spojení. Takže když vezmete svůj SQL, zdá se, že nejjednodušším řešením je buď použít správné spojení, nebo vhodně přesunout názvy tabulek a poté přesunout podmínky filtru z klauzule where do klauzule spojení.
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
Dalším způsobem, který by podle mého názoru měl být ekvivalentní, je
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
Protože nezáleží na tom, kde jsou požadavky na filtr na fs_fault. (a váš SQL engine to stejně všechno změní).
Upravit:Zde je SQLFiddle demonstruje filtrování klauzule spojení vs. klauzule where.