Saya memberikan jawaban saya karena saya memiliki keraguan yang signifikan tentang jawaban lain. Anda harus berhati-hati tentang persyaratan filter. Ingat, klausa where berjalan setelah Anda bergabung . Jadi jika ada persyaratan filter di klausa where yang merujuk ke tabel gabungan non-luar, Anda telah (dalam banyak keadaan) membatalkan gabungan luar Anda. Jadi mengambil sql Anda, Tampaknya solusi paling sederhana adalah menggunakan gabungan yang tepat atau memindahkan nama tabel dengan tepat, dan kemudian memindahkan kondisi filter dari klausa where dan ke dalam klausa gabungan.
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
Cara lain yang menurut saya harus setara adalah
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
Karena tidak masalah di mana persyaratan filter pada fs_fault berada. (dan mesin SQL Anda akan mengubah semuanya).
Sunting:Ini adalah SQLFiddle mendemonstrasikan pemfilteran pada klausa join vs. klausa where.