私は他の答えについて重大な疑問を持っているので、私は私の答えを与えています。フィルタの要件に注意する必要があります。 where句は結合後に実行されることを忘れないでください 。したがって、where句にフィルタ要件がある場合 非外部結合テーブルを参照している場合、(多くの状況で)外部結合を無効にしています。したがって、SQLを使用すると、適切な結合を使用するか、テーブル名を適切に移動してから、フィルター条件をwhere句からjoin句に移動するのが最も簡単な解決策のようです。
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
同等であると私が信じるもう1つの方法は
です。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句のフィルタリングを示します。