在JOIN条件下更改表的顺序

时间:2015-06-06 13:18:19

标签: sql join

鉴于以下情况:

表A有1000行,表B有5000行。

  

Q1:从Table_A左外连接Table_B中选择*   ON 条件

     

Q2:从Table_B左外连接Table_A中选择*   ON 条件

这有什么不同吗?在这些情况下会有任何性能差异吗?

3 个答案:

答案 0 :(得分:3)

是的,它会为LEFT JOIN产生差异。这两个语句不一样,执行路径可能不同。

第一个查询保留表A中的所有行,以及表B中的任何匹配值。因此,此版本至少返回1000行。

第二个保留表B中的所有行,加上表A中的任何匹配值。这不是一回事。此版本至少返回5000行。

对于INNER JOIN(或FULL OUTER JOIN),FROM子句中表的顺序不会影响结果集。但是,取决于优化器,它可能会影响联接的处理方式(我正在考虑优化器采用快捷方式的长连接链)。

答案 1 :(得分:0)

  

这会有什么不同吗?

是的。 LEFT JOIN定义:返回左表中的所有行+两个表中的匹配行。匹配行意味着两个表的交集。

因此,在您的情况下,返回的行数将非常不同。

Q1: Select * from Table_A Left Outer Join Table_B ON condition

在这种情况下,返回的行数将是1000(因为tableA有1000行,在JOIN左侧)加上匹配(表之间的交集)

Q2: Select * from Table_B Left Outer Join Table_A ON condition

在这种情况下,返回的行数将是5000(因为tableB有5000行,而JOIN左侧)加上匹配(表之间的交集)

查看相同[从This CodeProject Post获取的图像]的视觉表示:

enter image description here

答案 2 :(得分:-1)

这两个查询会有不同的结果。

请参阅W3 Schools Left Join

然后转到“自己动手”页面。可以编辑SQL以进行LEFT OUTER JOIN。