连接语句的SQL WHERE或ON

时间:2015-09-15 14:33:35

标签: sql sql-server

Way1:
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid
where a.condA = xx
AND a.condB = xx
AND a.condC = xx

Way2:
Select * from tableA inner join tableB 
on tableA.aid = tableB.aid
AND a.condA = xx
AND a.condB = xx
AND a.condC = xx

从上述语法判断,术语或表现是否存在显着差异?

4 个答案:

答案 0 :(得分:1)

通常,DBMS应该生成相同的执行计划。

我发现前者(JOIN语法)比后者更明显,因为它更清楚你正在做什么。

答案 1 :(得分:0)

不。没有区别。

INNER JOIN的情况没有任何区别,无论是表现明智还是结果明智。

如果是OUTER JOIN,条件的放置会产生差异。

答案 2 :(得分:0)

他们应该使用相同的结果生成相同的执行计划,使用示例1的优点是可读性。在小型查询中,可以使用其中任何一种,但随着查询变得越来越复杂,如果他们读过您的代码,那么拥有可读性并且对您的同行更好是很好的。这就像格式化,每个人都喜欢简洁的代码,易于阅读。

答案 3 :(得分:-1)

就查询是等价的而言,唯一真正重要的是外连接。在这些情况下,您是将标准置于联接中还是重要的位置。一个在外连接之前/期间应用,另一个在连接之后应用。因此,需要处理空值的条件作为外连接可能导致没有实际连接。因此,外连接的两个查询不等效。

有时在内部联接中,如果条件将导致字段转换为另一种类型,则会很重要。如果是这种情况,可能存在类型转换问题,导致其无法正常工作。换句话说,如果将整数列与字符串列进行比较,而字符串列包含“测试”,那么您将会遇到不好的时间。除非您通过连接条件排除这些行。

就性能而言,您希望将条件放在将要使用的索引中的连接中。除此之外,他们应该进入where子句,除非在联接中需要它们。

但你的榜样可能不是最好的。看起来所有针对特定值的特定字段的检查。如果您的条件只是根据一个常量或变量检查一个表中的值,则这些条件通常不会用作连接条件。