プロが教えるわが家の防犯対策術!

外部結合でどうしても理解できないパターンがあるので
どなたか詳しい人がいたら教えてください。

・まず、テーブルは下記のa_tblとb_tblの2テーブルです。
 SQL> desc a_tbl;
 名前 型
 ------ ---------------
 A1 CHAR(4)
 A2 CHAR(4)
 A3 CHAR(1)

 SQL> desc b_tbl;
 名前 型
 ------ -----------
 B1 CHAR(4)
 B2 CHAR(4)
 B3 CHAR(1)


・それぞれの内容は、
 SQL> select * from a_tbl;
 A1 A2 A3
 ---- ---- -
 1001 A001 1
 1002 A002 0
 1003 A003 1
 1004 A004 0
 1005 A005 1

 SQL> select * from b_tbl;
 B1 B2 B3
 ---- ---- -
 1001 B001 1
 1002 B002 0
 1003 B003 1
 1004 B004 0


・この2つのテーブルに対して、下記のselectを行います。
 SQL> select * from a_tbl, b_tbl where b1(+)=a1 and b3(+)='1';

 A1 A2 A3 B1 B2 B3
 ---- ---- -- ---- ---- --
 1001 A001 1 1001 B001 1
 1002 A002 0
 1003 A003 1 1003 B003 1
 1004 A004 0
 1005 A005 1

・私の予想では、下記の様になると思ったのですが、結果は
 上記の様になります。
 どのような考え方をすれば上記の結果になるのか教えてください。

 A1 A2 A3 B1 B2 B3
 ---- ---- -- ---- ---- --
 1001 A001 1 1001 B001 1
 1003 A003 1 1003 B003 1

A 回答 (4件)

通常の結合では、二つのテーブの等しい値をもつもののみ出力の対象となります。



でも、商品の受注データの一覧を表示する場合、出荷データがあればその情報も出力したい!ってな場合なんかはこれではこまります。
出荷データがばかりに受注データが表示されなければ意味がなくなるわけですから。

外部結合を使用すると主になるテーブルの値に対応する値が他のテーブルにない場合でも出力対象とすることができます。
この場合、存在しないレコードのカラムにはnullが設定されます。

b1(+)=a1の部分から考えますと、a1に対応するb1があればb1のデータを出力し、なければbテーブルのカラムにはnullが設定されます。
b3(+)='1'の部分についても、b3が'1'であればbテーブルのデータを出力するが、なければbテーブルのカラムにはnullが設定されます。

ということで、a1に対応するb1が存在する場合は以下ようになります。

 A1 A2 A3 B1 B2 B3
 ---- ---- - ---- ---- -
 1001 A001 1 1001 B001 1
 1002 A002 0 1002 B002 0
 1003 A003 1 1003 B003 1
 1004 A004 0 1004 B004 0
 1005 A005 1 null null null

さらに、b3が'1'でない場合、そのデータにはnullが割り当てられるので

 A1 A2 A3 B1 B2 B3
 ---- ---- - ---- ---- -
 1001 A001 1 1001 B001 1
 1002 A002 0 null null null
 1003 A003 1 null null null
 1004 A004 0 1004 B004 0
 1005 A005 1 null null null

bテーブルのカラムb3が'1'の場合だけbテーブルの値が出力されるという結果になると思うのですが。

といいながら、ちがったらごめんやなほんま...
    • good
    • 0
この回答へのお礼

ありがとう御座います!
なんとなく分かった気がします!

お礼日時:2001/03/28 12:22

おろろ?


すいません。下記の結果になるから上記の結果になるように
したいのだと勘違いしました。
確かに「下記の結果になると思った」ってかいてあります。
すいません。早とちりでした。

ってことは何も私の回答のような方法は取る必要ありませんね^^;

お恥ずかしい・・・・
    • good
    • 0
この回答へのお礼

いえいえ、回答して頂いて大変感謝しております。
私が分かり辛い質問をしただけなので、気にせず
これからも助けてください!

お礼日時:2001/03/27 13:29

外部結合を使用する場所の問題であるとおもいます。



select * from a_tbl, b_tbl
where A1 = B1
and B3 = "1"

で、
1001 A001 1 1001 B001 1
1003 A003 1 1003 B003 1
の3行を抽出します。次に、

select a_tbl.*, null, null, null
from a_tbl, b_tbl
where A1 = B1(+)
and B3 != "1"


1002 A002 0 (null null null)
1004 A004 0 (null null null)
1005 A005 1 (null null null)
を作成し、この2つを
order by A1 で UNION 結合するというのはどうですか?

select * from a_tbl, b_tbl
where A1 = B1
and B3 = "1"    #1個目のSQL
union
select a_tbl.*, null, null, null
from a_tbl, b_tbl
where A1 = B1(+)
and B3 != "1"    #2個目のSQL
order by A1
;
こんな感じですかね?
私の使っているDBには union っていうのがあるんですが
oracle(ですか?)にあるかどうか知りません。
    • good
    • 0
この回答へのお礼

すいません、私の質問の仕方が悪かったです。
ほしかった回答は、「私の予想結果」になるSQL文ではなく
select * from a_tbl,b_tbl where b1(+)=a1 and b3(+)='1'の
結果がどのような考えで下記の結果になるかと言う質問です。
 A1 A2 A3 B1 B2 B3
 ---- ---- -- ---- ---- --
 1001 A001 1 1001 B001 1
 1002 A002 0
 1003 A003 1 1003 B003 1
 1004 A004 0
 1005 A005 1

お礼日時:2001/03/27 11:43

select * from a_tbl, b_tbl where b1=a1 and b3='1';


とやればOKですが、はずしてたらごめんなさい。
(+)を外すだけです。
    • good
    • 0
この回答へのお礼

すいません、私の質問の仕方が悪かったです。
ほしかった回答は、「私の予想結果」になるSQL文ではなく
select * from a_tbl,b_tbl where b1(+)=a1 and b3(+)='1'の
結果がどのような考えで下記の結果になるかと言う質問です。
 A1 A2 A3 B1 B2 B3
 ---- ---- -- ---- ---- --
 1001 A001 1 1001 B001 1
 1002 A002 0
 1003 A003 1 1003 B003 1
 1004 A004 0
 1005 A005 1

お礼日時:2001/03/27 11:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!