Join 中的 Where 条件

Where criteria in a Join

向 JOIN 子句添加附加条件与将其放入 WHERE 子句相比,在性能上有什么不同吗?是否存在任何实际的功能差异(得到不同的结果)?一个比另一个好是因为其他原因吗?

例如:

SELECT * 
FROM MyTable1 mto
JOIN MyTable2 mto2 ON mto1.key = mto2.key
WHERE somefield = somevalue

VS

SELECT * 
FROM MyTable1 mto
JOIN MyTable2 mto2 ON mto1.key = mto2.key
                   AND somefield = somevalue

对于INNER JOIN,它们在逻辑上是等价的,并且会产生相同的结果。我希望查询规划器会为两个查询生成相同的计划,但它有可能对足够复杂的查询做一些奇怪的事情。我个人没有遇到过这种情况,但我不能排除优化器做奇怪的事情。

因此,INNER JOIN 的区别主要在于可读性。但是如果您怀疑查询规划器正在生成一个奇怪的计划,请尝试更改查询并比较查询计划。

不过 OUTER JOIN 秒,这是一个不同的故事。假设您有以下查询:

SELECT * FROM MyTable1 mto
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key
WHERE mto2.somefield = somevalue

VS

SELECT * FROM MyTable1 mto
LEFT JOIN MyTable2 mto2 on mto1.key = mto2.key
AND mto2.somefield = somevalue

在这种情况下,您的 WHERE 子句作用于 LEFT OUTER JOIN 的右侧 table。第一个查询将从 LEFT OUTER JOIN 中提取所有结果,然后 通过 WHERE 子句过滤这些结果。这有效地将 OUTER JOIN 转换为 INNER JOIN.

另一方面,第二个查询会将两个条件都视为 LEFT OUTER JOIN 和 return NULL 的一部分,用于不满足这两个条件的记录ON 子句,从而保留其 OUTER JOIN 性质。

这也适用于 RIGHT OUTER JOIN 左侧 table 列的任何 WHERE 条件。

如果 WHERE 条件在 LEFT OUTER JOIN 的左侧 table 或 table 的右侧table RIGHT OUTER JOIN,结果不会受到影响。