首先,这两种语法在语义上有所不同。使用JOIN时,您指定的条件定义了两个表之间的关系。因此,在您的第一个示例中,您正在指定表通过
cd.Company = table2.Name AND table2.Id IN (2728)
相关联。而使用WHERE子句,则表示关系是由
cd.Company = table2.Name
定义的,并且您只需要符合条件
table2.Id IN (2728)
的行。尽管两种方法得到的答案相同,但对于阅读您代码的程序员来说,它们意义完全不同。
在这种情况下,您几乎肯定是想要使用WHERE子句。
其次,如果您使用LEFT JOIN而不是INNER JOIN,实际上会有不同的结果。如果将第二个条件作为连接的一部分包含在内,则即使条件失败,仍将获得结果行-您将从左表获取值,并获得右表的null值。如果将该条件作为 WHERE 子句的一部分包含在内,且该条件失败,则根本不会获得该行。
以下是一个示例,以说明这一点。
查询1(WHERE):
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');