4

我想知道使用 WHERE 子句或使用内部联接的 ON 中的匹配是否有任何区别。

这种情况下的结果是一样的。

第一个查询:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn
    from production.Products
    group by categoryid
) 
select p.productname, mn
from Catmin 
inner join Production.Products p
on p.categoryid = Catmin.categoryid
and p.unitprice = Catmin.mn;

第二个查询:

with Catmin as 
(
    select categoryid, MIN(unitprice) as mn
    from production.Products
    group by categoryid
) 
select p.productname, mn
from Catmin 
inner join Production.Products p
on p.categoryid = Catmin.categoryid
where p.unitprice = Catmin.mn;          // this is changed

结果两个查询:

结果

4

3 回答 3

6

我的回答可能有点题外话,但我想强调一个当您将 INNER JOIN 转换为 OUTER JOIN 时可能出现的问题。

在这种情况下,将谓词(测试条件)放在 ON 或WHERE子句上的最重要区别是,如果您将要遗漏的表字段放入WHERE 子句。

例如,在表 A 和 B 之间的 LEFT JOIN 中,如果在 WHERE 子句中包含涉及 B 字段的条件,则很有可能在结果集中不会从 B 返回空行。有效且隐含地,您将 LEFT JOIN 变成了 INNER JOIN。

另一方面,如果您在 ON 子句中包含相同的测试,则将继续返回空行。

例如,使用以下查询:

SELECT * FROM A 
LEFT JOIN B
   ON A.ID=B.ID

该查询还将从 A 返回不匹配任何 B 的行。

进行第二个查询:

SELECT * FROM A 
LEFT JOIN B
WHERE A.ID=B.ID

第二个查询不会从 A 返回任何与 B 不匹配的行,即使您认为它会返回,因为您指定了 LEFT JOIN。这是因为测试 A.ID=B.ID 将在结果集中遗漏任何 B.ID 为空的行。

这就是为什么我喜欢将谓词放在 ON 子句而不是 WHERE 子句中的原因。

于 2013-10-03T13:30:27.430 回答
5

结果完全相同。由于查询性能的提高,更建议使用“ON”子句。

不是从表中请求数据然后过滤,而是通过使用 on 子句,您首先过滤第一个数据集,然后将数据连接到其他表。因此,要匹配的数据更少,结果更快。

于 2013-10-03T08:28:21.500 回答
3

上面两个查询输出没有区别,它们的结果都是一样的

当您使用 On Clause 时,连接操作仅连接那些与 Clause 中指定的 codidtion 匹配的ON

Where子句的情况下,连接操作连接所有行,然后根据指定条件的位置过滤掉

所以,显然 On Clause 更有效,应该优先于 where 条件

于 2013-10-03T08:29:15.067 回答