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
,结果不会受到影响。
向 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
,结果不会受到影响。