【问题标题】:SQL WHERE or ON for join statement [duplicate]连接语句的 SQL WHERE 或 ON [重复]
【发布时间】:2015-12-11 20:55:13
【问题描述】:
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

从上面的语法来看,在术语或性能上有什么明显的区别吗?

【问题讨论】:

  • 检查执行计划,就是这么简单。查询优化器也可以为两者生成相同的计划,但始终取决于它。
  • 请注意,如果您使用 left join 代替,两个查询的结果会有所不同。
  • 您可以在查询下拉列表中启用执行计划。运行查询后,它会向您显示完成的每个操作的计算成本,当您将鼠标悬停在图标上时会显示更多详细信息。
  • @juergend:左连接与内连接不同。 (您也可以使用 where 语法实现外部(左)连接,尽管每个 SQL 方言不同。(WHERE *= )

标签: sql sql-server


【解决方案1】:

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

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

【讨论】:

【解决方案2】:

没有。没有区别。

INNER JOIN 的情况下,无论是性能还是结果,它都没有任何区别。

OUTER JOIN 的情况下,条件的位置会有所不同。

【讨论】:

    【解决方案3】:

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

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

    在性能方面,您希望将条件放入连接中,以达到您要使用的索引。除此之外,除非在连接中需要它们,否则它们应该放在 where 子句中。

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

    【讨论】:

      【解决方案4】:

      它们应该生成相同的执行计划并得到相同的结果,使用示例 1 的优点是可读性。在小型查询中,两者都可以使用,但随着查询变得更加复杂,最好有一些可读的东西,如果他们读过你的代码,对你的同行也很好。这就像格式化,每个人都喜欢整洁的代码,易于阅读。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-17
        • 2012-07-17
        • 2018-12-28
        • 2018-10-06
        • 2012-10-19
        • 2011-12-12
        相关资源
        最近更新 更多