首先存在语义差异。当你有一个连接时,你说的是两个表之间的关系是由那个条件定义的。所以在你的第一个例子中,你说这些表是由cd.Company = table2.Name AND table2.Id IN (2728) 关联的。当您使用 WHERE 子句时,您是说该关系由 cd.Company = table2.Name 定义,并且您只想要条件 table2.Id IN (2728) 适用的行。尽管这些给出了相同的答案,但对于阅读您的代码的程序员来说,这意味着非常不同的事情。
在这种情况下,WHERE 子句几乎肯定就是您的意思,因此您应该使用它。
其次,在您使用 LEFT JOIN 而不是 INNER JOIN 的情况下,结果实际上存在差异。如果您将第二个条件作为连接的一部分,那么如果条件失败,您仍然会得到一个结果行——您将从左表中获取值,而右表则为空值。如果您将条件作为 WHERE 子句的一部分包含在内,并且该条件失败,您将根本无法获得该行。
这里有一个例子来证明这一点。
查询 1(在哪里):
SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
WHERE table2.Id IN (2728);
结果:
field1
200
查询 2 (AND):
SELECT DISTINCT field1
FROM table1 cd
LEFT JOIN table2
ON cd.Company = table2.Name
AND table2.Id IN (2728);
结果:
field1
100
200
使用的测试数据:
CREATE TABLE table1 (Company NVARCHAR(100) NOT NULL, Field1 INT NOT NULL);
INSERT INTO table1 (Company, Field1) VALUES
('FooSoft', 100),
('BarSoft', 200);
CREATE TABLE table2 (Id INT NOT NULL, Name NVARCHAR(100) NOT NULL);
INSERT INTO table2 (Id, Name) VALUES
(2727, 'FooSoft'),
(2728, 'BarSoft');