Tôi đang đưa ra câu trả lời của mình vì tôi có nghi ngờ đáng kể về các câu trả lời khác. Bạn phải cẩn thận về các yêu cầu bộ lọc. Hãy nhớ rằng, mệnh đề where chạy sau khi bạn tham gia . Vì vậy, nếu có bất kỳ yêu cầu bộ lọc nào trong mệnh đề where tham chiếu đến bảng không được nối bên ngoài, bạn đã (trong nhiều trường hợp) đã vô hiệu hóa phép nối bên ngoài của mình. Vì vậy, lấy sql của bạn, Có vẻ như giải pháp đơn giản nhất là sử dụng nối thích hợp hoặc di chuyển tên bảng một cách thích hợp, sau đó di chuyển các điều kiện lọc ra khỏi mệnh đề where và vào mệnh đề nối.
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
Một cách khác mà tôi tin rằng nên tương đương là
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
Vì nó không hoàn toàn quan trọng các yêu cầu bộ lọc trên fs_fault ở đâu. (và công cụ SQL của bạn sẽ thay đổi tất cả điều đó).
Chỉnh sửa:Đây là SQLFiddle thể hiện việc lọc mệnh đề tham gia so với mệnh đề where.