2012-03-08 13 views
125

パフォーマンスを無視して、以下のクエリAおよびBと同じ結果が得られますか? CとDはどうですか?結合順序はSQLで重要ですか?

-- 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> 
+5

」とは何ですか?あなたはAとBとAとCを結合しているのですか、AとBとBとCを結合していますか? – beny23

+1

こんにちはベニー、私の質問のコードは抽象です。私はAをBまたはAとCに結びつけることに関心がありません。同じ結果が得られるような構文を知りたいだけです。 –

答えて

156

INNERの場合、いいえ、順序は関係ありません。選択肢をSELECT *からSELECT a.*, b.*, c.*に変更する限り、クエリは同じ結果を返します。 (LEFTRIGHTまたはFULL)については


OUTERは、はい、受注案件に参加する - 物事がはるかに複雑である(を更新)して。

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

まず

、外部結合は、そうa LEFT JOIN bは(可換性と結合性)の両方を含んで、あなたの例の特性のため、連想ではありませんどちらかb LEFT JOIN a

外部結合と同じではありません、可換ではありません

と同等です:

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 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 a.x <= b.xまたはON a.x = 7またはON a.x LIKE b.xまたはON (a.x, a.y) = (b.x, b.y)と2つのクエリは、まだ相当します。

ただし、IS NULLのいずれか、またはCOALESCE()のようなヌルに関連する関数が含まれる場合、たとえば条件がb.ab_id IS NULLの場合、2つのクエリは同等ではありません。

+2

外部結合は、述語がIS NULLを伴わない限り、1つの表のすべての列がNULLである述語を満たすことができない限り、結合的であると言う方が正しいといえます。または 'ヌルに関連する関数'です。 'a.somecol> 0 OR b.someothercol> 0'のように、前者の説明を満足するが後者は満足させる述語を簡単に想像することができます。その条件のために連想は失敗する可能性があります。 –

+0

しかし、ええ、私は、述語がここで説明する条件のいずれかを満たしていない限り、OUTER JOINは結合的であると言うのは技術的に正しいと思います。http://stackoverflow.com/questions/20022196/are-left-外部結合結合/ 20022925#20022925(その最初のものもINNER JOINの結合性を壊しますが、おそらく言及する価値がないので、安くて明白なアプローチです) また、一般的な種類のJOIN - 外部キーでのジョイング - これらの条件のいずれかを満たしておらず、結びつきが良い。 –

+0

@ MarkAmeryありがとう、私はその時点で私の文章を構造化するのに苦労していました(そして私はあなたの答えを既にアップしました;) –

4

通常の結合については、そうではありません。 TableA join TableBTableB join TableAと同じ実行計画を作成します(CとDの例が同じになるように)

左右のジョイントのために実行プランが作成されます。TableA left Join TableBTableB left Join TableAとは異なりますが、それ以外は同じTableB right Join TableA

+2

これはcommutativityにしか対応していませんが、質問の例は質問者が連想に興味があることを示しています。 ypercubeの答えは両方を扱います。 –

関連する問題