- ベストアンサー
外部結合
外部結合でどうしても理解できないパターンがあるので どなたか詳しい人がいたら教えてください。 ・まず、テーブルは下記の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
- みんなの回答 (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テーブルの値が出力されるという結果になると思うのですが。 といいながら、ちがったらごめんやなほんま...
その他の回答 (3)
おろろ? すいません。下記の結果になるから上記の結果になるように したいのだと勘違いしました。 確かに「下記の結果になると思った」ってかいてあります。 すいません。早とちりでした。 ってことは何も私の回答のような方法は取る必要ありませんね^^; お恥ずかしい・・・・
お礼
いえいえ、回答して頂いて大変感謝しております。 私が分かり辛い質問をしただけなので、気にせず これからも助けてください!
外部結合を使用する場所の問題であるとおもいます。 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(ですか?)にあるかどうか知りません。
お礼
すいません、私の質問の仕方が悪かったです。 ほしかった回答は、「私の予想結果」になる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)
select * from a_tbl, b_tbl where b1=a1 and b3='1'; とやればOKですが、はずしてたらごめんなさい。 (+)を外すだけです。
お礼
すいません、私の質問の仕方が悪かったです。 ほしかった回答は、「私の予想結果」になる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
お礼
ありがとう御座います! なんとなく分かった気がします!