【发布时间】:2014-04-14 04:04:49
【问题描述】:
我想知道将JOIN 的条件放在ON () 子句中是否比在后者WHERE 中更好维护。
例子:
Select * from persons p
INNER JOIN x on (x.id = p.id AND x.other = p.other)
Select * from persons p
INNER JOIN x on (x.id = p.id)
WHERE x.other = p.other
这里看起来不错,但是有多个 JOIN,我认为它更难:
Select * from persons p
INNER JOIN x on (x.id = p.id)
INNER JOIN x2 on (x2.id = p.id)
INNER JOIN x3 on (x3.id = p.id)
WHERE x.other = p.other AND x2.other = p.other2 AND x3.other = p.other3
Select * from persons p
INNER JOIN x on (x.id = p.id AND x.other = p.other)
INNER JOIN x2 on (x2.id = p.id AND x2.other = p.other2)
INNER JOIN x3 on (x3.id = p.id AND x3.other = p.other3)
我对正在开发的应用程序进行了测试,切换条件会产生相同的执行计划,我想我不知道我是否遗漏了什么,或者我是否可以在某些情况下发现性能影响。
谢谢
编辑:它与被标记为重复的问题不同。我不问 JOIN 和 WHERE 之间的区别。我问在使用 JOIN 语句时将条件放在 WHERE 和不在 ON 子句中的区别。
正如我在上一个问题的评论中所说,第二个 JOIN 处理已经过滤的数据不应该比 WHERE 稍后处理所有数据更快吗?
【问题讨论】:
-
您在第二个查询中从哪里获得 p2 和 p3 别名?
-
您应该始终使用 ANSI 语法 JOIN,因为条件更明确且更易于维护。 ANSI JOIN 将条件与关系条件分开
-
考虑连接位置的快速方法是,当您使用
join使用on()时,您正在创建一个“临时表”,该表已经返回您所要求的配对结果它到。如果您在where中使用join,则您要求获取整个表,然后在收到每条数据后进行过滤。在小型应用程序中,您不会看到性能下降,但如果您使用的是实时数据或成千上万的行,您会立即知道。 -
您的上一个问题有几票需要重新打开等待,因为您是正确的,它被错误地关闭了关于连接语法的问题。
-
除了易于维护和更具可读性(这本身应该就足够了)之外,主要区别在于应用条件的阶段。当您在
JOIN条件 (ON/USING) 中应用条件时 - 该条件实际上是在构建组合结果集期间应用的。而在另一种情况下(WHERE子句)- 仅在构造结果集后才应用条件...