• ベストアンサー

外部結合

外部結合でどうしても理解できないパターンがあるので どなたか詳しい人がいたら教えてください。 ・まず、テーブルは下記の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

質問者が選んだベストアンサー

  • ベストアンサー
  • takasgy
  • ベストアンサー率42% (30/71)
回答No.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テーブルの値が出力されるという結果になると思うのですが。 といいながら、ちがったらごめんやなほんま...

CUNCUN
質問者

お礼

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

その他の回答 (3)

noname#1802
noname#1802
回答No.3

おろろ? すいません。下記の結果になるから上記の結果になるように したいのだと勘違いしました。 確かに「下記の結果になると思った」ってかいてあります。 すいません。早とちりでした。 ってことは何も私の回答のような方法は取る必要ありませんね^^; お恥ずかしい・・・・

CUNCUN
質問者

お礼

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

noname#1802
noname#1802
回答No.2

外部結合を使用する場所の問題であるとおもいます。 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(ですか?)にあるかどうか知りません。

CUNCUN
質問者

お礼

すいません、私の質問の仕方が悪かったです。 ほしかった回答は、「私の予想結果」になる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

  • pcg733
  • ベストアンサー率78% (11/14)
回答No.1

select * from a_tbl, b_tbl where b1=a1 and b3='1'; とやればOKですが、はずしてたらごめんなさい。 (+)を外すだけです。

CUNCUN
質問者

お礼

すいません、私の質問の仕方が悪かったです。 ほしかった回答は、「私の予想結果」になる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