これを INNER JOIN で実行しても、実際には違いはありません。
ただし、LEFT または RIGHT JOIN を使用すると、できます。 追加のフィルターを JOIN に入れるか WHERE 句に入れるかで違いが生じます。
フィルタを WHERE 句に入れると、SQL Server は最初に結合を行い、次に完全に結合します。 フィルタが適合しない行を除外します。
--> これにより、返される行数が減少します
フィルターを JOIN に配置すると、SQL Server は結合中にフィルター処理を行いますが、フィルターを配置したテーブルに対してのみです。
他のテーブルからすべての行を取得しますが、それらのテーブルのみにデータがあります。
-->これにより行数が減ることはありませんが、フィルター テーブルからのデータを含む列はより多くの行で空になります
説明するのは難しいです...もっと明確にするために、例を挙げます:
CREATE TABLE [dbo].[t1](
[ID] [int] NULL,
[StatusID] [int] NULL
) ON [PRIMARY]
CREATE TABLE [dbo].[t2](
[ID] [int] NULL
) ON [PRIMARY]
INSERT INTO t1 (ID, StatusID) VALUES (1, 10)
INSERT INTO t1 (ID, StatusID) VALUES (2, 11)
INSERT INTO t1 (ID, StatusID) VALUES (3, 12)
INSERT INTO t1 (ID, StatusID) VALUES (4, 12)
INSERT INTO t2 (ID) VALUES (1)
INSERT INTO t2 (ID) VALUES (3)
INSERT INTO t2 (ID) VALUES (5)
...そして、次のクエリを実行します:
/* this returns four rows, but only two will have data
from the second table in the second column */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
/* this returns only one row: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
WHERE t2.ID = 1
/* this returns four rows as in the first query, but only one
row will have data in the second column: the one where t2.ID = 1 */
SELECT t1.ID, t2.ID
FROM t1
LEFT JOIN t2 ON t1.Id = t2.Id
AND t2.ID = 1
コメントに示されているように、異なる結果に注意してください。