sql題目 - SQL中的連接順序是否重要?




sql連接 (2)

無視表現,我會從下面的查詢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>  

如果您在加入b之前嘗試在b的字段上加入c,即:

SELECT a.x, a.y, a.z FROM a 
   INNER JOIN c
       on b.x = c.x
   INNER JOIN b
       on a.x = b.x

你的查詢將失敗,所以在這種情況下,訂單很重要。


對於INNER加入,不,訂單無關緊要。 只要您將選擇從SELECT *更改為SELECT a.*, b.*, c.*查詢就會返回相同的結果。

對於( LEFTRIGHTFULLOUTER加入,是的,訂單很重要 - ( 更新 )的事情要復雜得多。

首先,外連接是不可交換的,所以a 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

另一個(希望更簡單)的結合性例子。 把它看作(a 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

相當於 a 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_idc.bc_id = b.bc_id都是相等性檢查,不涉及NULL比較。

你甚至可以對其他操作符或更複雜的操作符有條件: ON ax <= bxON ax = 7ON ax LIKE bxON (ax, ay) = (bx, by) ,兩個查詢仍然是等價的。

但是,如果其中任何一個涉及到IS NULL或與像COALESCE()這樣的空值相關的函數,例如,如果條件是b.ab_id IS NULL ,那麼這兩個查詢就不會等效。







relational-database