-PR-
解決済み

外部結合

  • 困ってます
  • 質問No.56380
  • 閲覧数88
  • ありがとう数5
  • 気になる数0
  • 回答数4
  • コメント数0

お礼率 51% (18/35)

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

・まず、テーブルは下記の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
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.4
レベル9

ベストアンサー率 42% (30/71)

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

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

外部結合を使用すると主になるテーブルの値に対応する値が他のテーブルにない場合でも出力対象とすることができます。
この場合、存在しないレコードのカラムには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

お礼率 51% (18/35)

ありがとう御座います!
なんとなく分かった気がします!
投稿日時 - 2001-03-28 12:22:21
-PR-
-PR-

その他の回答 (全3件)

  • 回答No.3

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

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

お恥ずかしい・・・・
お礼コメント
CUNCUN

お礼率 51% (18/35)

いえいえ、回答して頂いて大変感謝しております。
私が分かり辛い質問をしただけなので、気にせず
これからも助けてください!
投稿日時 - 2001-03-27 13:29:39


  • 回答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

お礼率 51% (18/35)

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

ベストアンサー率 78% (11/14)

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

お礼率 51% (18/35)

すいません、私の質問の仕方が悪かったです。
ほしかった回答は、「私の予想結果」になる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:48
このQ&Aのテーマ
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

-PR-
-PR-
このQ&Aにこう思った!同じようなことあった!感想や体験を書こう
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ