Это действительно не имеет значения, когда вы делаете это в INNER JOIN.
Однако, когда вы используете LEFT или RIGHT JOIN, не имеет значения , если вы добавили дополнительный фильтр в JOIN или в предложение WHERE.
Когда вы помещаете фильтр в предложение WHERE, SQL Server сначала выполняет объединение, а затем полностью отфильтровывает строки, к которым фильтр не подходит.
-> это уменьшит количество возвращаемых строк
Когда вы помещаете фильтр в соединение, SQL Server выполняет фильтрацию во время соединения, но только в таблице, в которую вы помещаете фильтр.
Вы по-прежнему получаете все строки из других таблиц, но только те из них имеют данные из отфильтрованной таблицы, к которым подходит фильтр.
-> это не уменьшит количество строк, но столбцы с данными из таблицы фильтров будут пустыми в большем количестве строк
Сложно объяснить ... чтобы прояснить ситуацию, вот пример:
Взять пример данных из Ответ RedFilter :
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
Обратите внимание на разные результаты, как указано в комментариях.