【问题标题】:Join Query - If join table order changes连接查询 - 如果连接表顺序发生变化
【发布时间】:2017-03-25 08:43:36
【问题描述】:

查询1:

select * from t1 inner join t2 on t1.id = t2.id
                   left join t4 on t2.id = t4.id
                   left join t3 on t2.id = t3.id

查询2:

select * from t1 inner join t2 on t1.id = t2.id
                   left join t3 on t2.id = t3.id
                   left join t4 on t2.id = t4.id

Query1 和 Query2 的结果是否相同?

【问题讨论】:

  • 你有什么问题?
  • 请重新审视您的问题
  • 您将获得相同的行。但是您没有指定 ORDER BY 子句,因此引擎可能会对这些行进行不同的排序。
  • 执行连接条件保持不变的事实,总体而言,在这种情况下,您的更改之间没有关系 e 查询是相同的..如果您交换更改,结果可能会改变(在您的情况下) t1 和 t2

标签: sql join outer-join


【解决方案1】:

在比较具有不同join 订单的联接时需要小心。如果连接都是内部连接,那么顺序无关紧要。你的例子有外部连接。

从 t1 内连接 t2 on t1.id = t2.id 左连接 t4 on t2.id = t4.id 左连接 t3 在 t2.id = t3.id

from t1 inner join
     t2
     on t1.id = t2.id left join
     t3
     on t2.id = t3.id left join
     t4
     on t2.id = t4.id

在这种情况下,两个连接的条件是相互独立的。也就是说,t3t4 仅与较早出现的 t2 进行比较。连接的顺序不会对结果集产生影响。

当你在考虑结果集是否相同时,你需要考虑以下(至少):

  • 是否有任何连接键 NULL
  • 是否从所有表中选择列?
  • 是否所有连接条件都匹配?
  • 连接是否从左到右更改了?
  • FROM 子句中是否有括号?

对于看起来非常相似的查询,可能会有令人惊讶的(但细微的)差异。

【讨论】:

    猜你喜欢
    • 2013-05-26
    • 2011-04-27
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    • 2017-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多