加入查询 - 如果连接表顺序发生变化

时间:2017-03-25 08:43:37

标签: sql join outer-join

查询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的结果是否相同?

1 个答案:

答案 0 :(得分:0)

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

来自t1内部联接      T2      在t1.id = t2.id左连接      T4      在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条款中是否有括号?

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