【问题标题】:Does it make a difference to change the order of JOIN ON condition?改变 JOIN ON 条件的顺序有区别吗?
【发布时间】:2017-08-28 10:50:27
【问题描述】:

假设我有一个表 EMPLOYEES,它有 100,000 行。 我有 DEPENDENTS 表,它有 200,000 行。

我可以从员工表中获取所有家属及其关系的列表(EMPLOYEES 有一个列 EMP_ID,它是 DEPENDENTS 中的外键,名称为 PARENT_EMP_ID)。

SELECT
    D.FIRST_NAME,
    D.LAST_NAME,
    E.EMPLOYEE_NAME AS DEPENDENT_OF
 FROM
    DEPENDENTS D
    LEFT JOIN EMPLOYEES E ON D.PARENT_EMP_ID = E.EMP_ID

我的问题是: 如果我这样加入表格会有什么不同吗:

...
FROM DEPENDENTS D 
LEFT JOIN EMPLOYEES E ON D.PARENT_EMP_ID = E.EMP_ID

对比:

...
FROM DEPENDENTS D 
LEFT JOIN EMPLOYEES E ON E.EMP_ID = D.PARENT_EMP_ID

请注意,我已经更改了条件的顺序,保留了表本身的顺序,因为我需要来自受抚养人的所有行(不在乎我是否从 EMPLOYEES 表中得到重复项)。

【问题讨论】:

  • 完全没有区别
  • 条件中没有(逻辑)顺序。订单是DEPENDENTS LEFT JOIN EMPLOYEES。反转 that 是一种语义变化。你如何写下你的情况不是。优化器不会基于此更改其计划。
  • 如果您希望提高性能,请问问自己为什么要使用左连接而不是内连接。
  • 我会感谢对我的问题投反对票的人来详细说明原因。我搜索了我的问题的答案,但在任何地方都找不到。
  • 向下投票箭头的鼠标悬停文本包括“不显示任何研究工作”。您的问题绝对是基本的,您可以阅读任何介绍或谷歌重新选择、加入、执行、执行等以及您找到的单词。你没有说你可能意味着什么样的差异,例如逻辑评估顺序和查询返回什么,与性能差异。如果你搜索总结它和你发现了什么。说出您使用的参考资料。

标签: sql join left-join


【解决方案1】:

任何逻辑连接都将转换为以下物理连接之一..

  • 嵌套循环
  • 散列连接
  • 合并加入

对于上述所有物理连接,每个连接的实现方式都不同,并且像您更改的方式一样更改子句并不重要

对于下面的加入你有..

E.EMP_ID = D.PARENT_EMP_ID

如果我们假设,SQL 为您的查询选择了哈希联接。在这种情况下,sql 选择行数较少的表作为构建表,它将使用该表来探测其他表。

即使你改变了连接,也没关系

【讨论】:

    【解决方案2】:

    不,根本不会有任何变化,因为表 DEPENDENTS 的元素与表 EMPLOYEES 的元素进行比较,在这两种情况下都将 DEPENDENTS 表作为基表,因此条件的顺序无关紧要。但是如果更改了基表的顺序,则两种情况的结果都会有所不同。

    【讨论】:

    • 行内的顺序与行的顺序无关。但表没有排序。如果您要解决这个问题,那么实现是有顺序的,但您不是。另请阅读对类似问题的更多好坏答案,以了解更多关于差异的信息。还要确保您的答案确实解释并证明了这一点。而且你知道你在说什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-22
    • 2012-09-15
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多