在 INNER JOIN 中执行此操作确实没有区别。
但是,当您使用 LEFT 或 RIGHT JOIN 时,确实将附加过滤器放入 JOIN 或 WHERE 子句中。
当您将过滤器放入 WHERE 子句时,SQL Server 先进行连接,然后完全过滤掉过滤器不适合的行。
--> 这将减少返回的行数
当您将过滤器放入 JOIN 时,SQL Server 在连接期间执行过滤,但仅在您放置过滤器的表上进行。
您仍然可以从其他表中获取所有行,但只有那些具有过滤器适合的过滤表中的数据。
--> 这不会减少行数,但是过滤器表中包含数据的列将在更多行中为空
很难解释...为了更清楚,这里有一个例子:
从RedFilter's answer获取样本数据:
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
注意 cmets 中显示的不同结果。