在将其他条件添加到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
答案 0 :(得分:3)
对于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
的右侧表上。第一个查询将从LEFT OUTER JOIN
中撤回所有结果,然后通过WHERE
子句过滤这些结果。这有效地将OUTER JOIN
转换为INNER JOIN
。
另一方面,第二个查询会将这两个条件视为LEFT OUTER JOIN
的一部分,并返回NULL
以查找不符合{{1}的两个条件的记录}子句,从而保留其ON
性质。
这也适用于OUTER JOIN
左侧表格列上的任何WHERE
条件。
如果RIGHT OUTER JOIN
条件位于WHERE
左侧表格的列上,或LEFT OUTER JOIN
上的右侧表格上,则结果不会受到了影响。