SQL中的连接顺序是否重要?

忽略性能,我将从下面的查询A和B获得相同的结果? C和D怎么样?

-- A
select *
from   a left join b
           on <blahblah>
       left join c
           on <blahblan>


-- B
select *
from   a left join c
           on <blahblah>
       left join b
           on <blahblan>  

-- C
select *
from   a join b
           on <blahblah>
       join c
           on <blahblan>


-- D
select *
from   a join c
           on <blahblah>
       join b
           on <blahblan>  
对于INNER加入,没有,顺序无所谓。查询将返回相同的结果,只要将选择从SELECT *更改为SELECT a。*,b。*,c。*。

对于(LEFT,RIGHT或FULL)OUTER连接,是的,顺序重要 – 和(更新)的东西要复杂得多。

首先,外部联接不是可交换的,因此LEFT JOIN b不同于b LEFT JOIN a

外部联接也不是关联的,因此在涉及(交换性和关联性)属性的示例中:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id
  LEFT JOIN c
    ON c.ac_id = a.ac_id

等效于:

a LEFT JOIN c 
    ON c.ac_id = a.ac_id
  LEFT JOIN b
    ON b.ab_id = a.ab_id

但:

a LEFT JOIN b 
    ON  b.ab_id = a.ab_id
  LEFT JOIN c
    ON  c.ac_id = a.ac_id
    AND c.bc_id = b.bc_id

不等于:

a LEFT JOIN c 
    ON  c.ac_id = a.ac_id
  LEFT JOIN b
    ON  b.ab_id = a.ab_id
    AND b.bc_id = c.bc_id

另一个(希望更简单)的关联性例子。想想这个(LEFT JOIN b)LEFT JOIN c:

a LEFT JOIN b 
    ON b.ab_id = a.ab_id          -- AB condition
 LEFT JOIN c
    ON c.bc_id = b.bc_id          -- BC condition

这等效于LEFT JOIN(b LEFT JOIN c):

a LEFT JOIN  
    b LEFT JOIN c
        ON c.bc_id = b.bc_id          -- BC condition
    ON b.ab_id = a.ab_id          -- AB condition

只因为我们有“好”的ON条件。 ON b.ab_id = a.ab_id和c.bc_id = b.bc_id都是相等性检查,不涉及NULL比较。

您甚至可以使用其他运算符或更复杂的条件,如:ON ax <= bx或ON ax = 7或ON ax LIKE bx或ON(ax,ay)=(bx,by)当量。 然而,如果这些涉及的任何一个IS NULL或与像COALESCE()的空相关的函数,例如如果条件是b.ab_id IS NULL,则两个查询将不等效。

http://stackoverflow.com/questions/9614922/does-the-join-order-matter-in-sql

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:SQL中的连接顺序是否重要?