2016-12-16 9 views
0

結合構文を参加します。は、Oracleの外側に苦しん

我々は内側と外側の合流でこのクエリを持っています。

SELECT A.aa, B.bb, C.cc, D.dd 
FROM 
    TABLEA A, TABLEB B, TABLEC C, TABLED D 
WHERE 
    A.XX = B.XX AND 
    B.YY = C.YY AND 
    C.ZZ = D.WW (+) 

クエリは正常に動作します。テーブルAとテーブルB(XX上)のリンクが存在しない可能性があります。

は、だから我々は外にこれを有効にかかわらず、既存の加入するかどうかのデータを返す満たされているORどの参加したいAおよびB(および他のテーブル)との間にリンクがない場合。

どうすればいいですか?

+1

これは、これを書いている古い方法で、見てJOINコマンドを使用することができます。 – Chuck

+0

Bにリンクされていない行と、B、C、Dの行がリンクされていて、Aでリンクされていないとします。Aからの唯一の値を持つ1つの行を抽出しますか? – Aleksej

+0

はい、Aの詳細を持つ単一の行です。他のテーブルの値はnullになります。 –

答えて

3

では、次のようなあなたのテーブルがあるとしましょう:

insert into tableA values (1); 
insert into tableA values (2); 
insert into tableB values (1, 10); 
insert into tableB values (-2, 20); 
insert into tableC values (10, 100); 
insert into tableC values (20, 200); 
insert into tableD values (200); 
insert into tableD values (999); 

私はよく理解していれば、あなたは外BとC、Dだけでなく、上にも参加する上で使用する必要があります。古いOracle構文で、これは次のとおりです。

SELECT * 
FROM 
    TABLEA A, TABLEB B, TABLEC C, TABLED D 
WHERE 
    A.XX = B.XX(+) AND 
    B.YY = C.YY(+) AND 
    C.ZZ = D.WW (+) 

そして、(良い)のANSI SQLに:

select * 
from tableA A 
     left outer join 
    tableB B on (A.xx = B.xx) 
     left outer join 
    tableC C on (B.yy = C.yy) 
     left outer join 
    tableD D on (C.zz = D.ww) 

彼らの両方を与える:

 XX   XX   YY   YY   ZZ   WW 
---------- ---------- ---------- ---------- ---------- ---------- 
     2 
     1   1   10   10  100 
+0

ありがとうございました。コメントは、AとBの間にリンクが存在する場合、BとCの間にリンクがあることが保証されているため、外部にする必要はありません。 CとDはリンクが保証されていないので、そこにアウターが必要です。 –

+0

@MarcusLeon答えが正しい場合はマークを付けることを忘れないでください – Kateract

+0

します。私はそれが私のために働くかどうかを確認するために、次のカップルの日にこれでいくつかのテストを行うつもりです。 –

関連する問題