2017-01-24 22 views
0

期待通りに外部結合を使用して問合せを処理することに問題があります。LEFT JOIN on Oracle

データは次のとおりです。

TABLE a: 

    id 
    1 
    2 
    3 

TABLE b: 

    id aid 
    11 1 
    12 2 

TABLE c: 

    id bid 
    21 11 
    22 12 

クエリは次のとおりです。

a.id b.id b.aid c.id c.bid 
1  11  1  21  11 
2  12  2  22  12 
3  null null null null 

SELECT * 
FROM 
    a 
    LEFT JOIN 
    b 
    ON a.id = b.aid 
    INNER JOIN c 
    ON b.id = c.bid 

は、私はすべてのa、可能であれば取得する必要があり、このようなbcINNER JOINはちょうどの延長です前のLEFT JOINが一致したときはになります。

その代わり、私が手:

a.id b.id b.aid c.id c.bid 
1  11  1  21  11 
2  12  2  22  12 

INNER JOINなしの私は予想通り、取得:

a.id b.id b.aid 
1  11  1 
2  12  2 
3  null null 

OracleおよびMS SQL Serverの間の結合の異なる定義があるようです。 (間違っている)

予想される結果を得るためにクエリを書く方法を理解できません。

+1

内部での違いはありませんし、私は次のようになり、SQL ServerとOracleの – edc65

+4

間の結合左:

あなたはBの間の結合のための外部結合を使用する必要があり、およびCにもSQL Serverがそれに対して何か異なるものを返した場合。 –

+1

(2番目の)内部ジョイはb.idのヌル値に参加できません。あなたのexpectionは正しくないようです。oracleとms sqlは同じ方法で動作します.for参加する – scaisEdge

答えて

3

これは正しい動作で、SQL Serverがまったく同じ戻ります結果。 http://rextester.com/EEGBZ41105

bとcの間で内部結合を行っているため、これは基本的にaとbの間の外部結合を無効にします。

あなたは期待される出力の最後の行を見れば:

a.id b.id b.aid c.id c.bid 
3  null null null null 

そして今、参加条件b.id = c.bidを見て、それが原因にb.idの値がnullであるので、それはその行を削除することはかなり明らかですaとbの間の外部結合。したがって、内部結合はその行を再び削除します。 **驚い非常に**あり

SELECT * 
FROM a 
    LEFT JOIN b ON a.id = b.aid 
    LEFT JOIN c ON b.id = c.bid 
; 
+0

*私は恥ずかしいです:) *ありがとうございました! – pid

+0

私が前に働いた場所で 'ANSI_NULLS'がオンになっているかどうかはわかりません。また、ACCESSのVB.NETサイフォンデータをDBに使用しました。ですから、私はNULLに気付かずに 'NULL = NULL'の世界で何年も住んでいた可能性があります(私は非常にうまく「NULL」が他のものと等しくないことを学んでいました)。 – pid

+0

@pid:私はその部分を削除しました。 'ansi_nulls'がオフに設定されていても、私は別の結果を得ません –

1

あなたのクエリは(括弧に注意してください)。このように解釈されます。

SELECT * 
FROM 
    (
    a 
    LEFT JOIN 
    b 
    ON a.id = b.aid 
    ) 
    INNER JOIN c 
    ON b.id = c.bid 

代わりに、あなたはおそらく意味:

SELECT * 
FROM 
    a 
    LEFT JOIN 
    (
    b 
    INNER JOIN c 
    ON b.id = c.bid 
    ) 
    ON a.id = b.aid 
+0

はい、それは私が意図したものです。ありがとう、他の答えは結果を得る方法を示しています! – pid