加入

时间:2016-05-04 19:26:27

标签: sql join where

在将其他条件添加到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

1 个答案:

答案 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上的右侧表格上,则结果不会受到了影响。