外部結合でどうしても理解できないパターンがあるので
どなたか詳しい人がいたら教えてください。
・まず、テーブルは下記の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
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テーブルの値が出力されるという結果になると思うのですが。
といいながら、ちがったらごめんやなほんま...
No.3
- 回答日時:
おろろ?
すいません。下記の結果になるから上記の結果になるように
したいのだと勘違いしました。
確かに「下記の結果になると思った」ってかいてあります。
すいません。早とちりでした。
ってことは何も私の回答のような方法は取る必要ありませんね^^;
お恥ずかしい・・・・
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(ですか?)にあるかどうか知りません。
すいません、私の質問の仕方が悪かったです。
ほしかった回答は、「私の予想結果」になる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
No.1
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- SQL Server [SQLServer] テーブル名からカラム名を取得する 1 2022/08/23 21:20
- Oracle 下記のsqlで取得されるレコード以外を取得する方法ありますでしょうか。 SELECT B.番号, B 2 2022/04/20 23:21
- Oracle sqlで質問です。 aテーブルとbテーブルがあり、下記のsqlで取得したidとnameに一致しないレ 1 2022/04/20 20:34
- Oracle 質問です。 下記のテーブルとデータがあり、 取得想定結果のように出力したいです。 下記のsqlだと0 2 2023/05/23 19:10
- Visual Basic(VBA) access count数を変数に格納 2 2022/03/30 19:21
- JavaScript 電車の運賃を出すプログラムを作っています。 2 2022/06/22 09:36
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- Visual Basic(VBA) VBAコードで質問があります 2 2022/10/20 15:27
- JavaScript 中百舌鳥駅と深井駅を入れ替えて選択しても同じ挙動にしたいです。 2 2022/06/24 18:45
- PostgreSQL postgreSQL カラムの全ての値を取得したい 3 2022/10/07 12:33
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルのフィルタ抽出が固まる
-
ACCESSのSQLで、NULLかNULLでな...
-
Accessを開きなおすとテキスト...
-
データベースファイル(.db)を開...
-
Excelフィルタ抽出で「検索して...
-
20万行あるデータを動かしたい
-
Accessフォームからパラメータ...
-
データベースとウェブ(WWW)の共...
-
構文エラー:演算子がありませ...
-
「1004:アプリケーション定義...
-
テキストボックスにコントロー...
-
シャープレジスター エラーコード
-
顧客データベースを作る場合、...
-
QRコードとバーコードについて
-
日通NECロジスティクスの追跡サ...
-
Notion@リレーション値の取得...
-
MS access2021で販売管理を作成...
-
エクセル 顧客管理表に担当ごと...
-
最新の日付とその金額をクエリ...
-
FileMaker Pro 10 で令和を表示
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessの表結合SQL
-
複数行の結果を単一列に連結(...
-
postgres 外部結合(AからB、Bか...
-
エクセルVBAで5行目からオート...
-
「直需」の意味を教えてください
-
Accessでテーブル名やクエリ名...
-
Accessでコードを入れると名前...
-
Oracle 2つのDate型の値の差を...
-
Accessでテーブルの値をテキス...
-
Access テキスト型に対する指定...
-
作番ってどういう意味でしょうか?
-
セルの右クリックで出る項目を...
-
テーブルの存在チェックについて
-
変数が選択リストにありません
-
アクセス エラーを数値「0」に...
-
ACCESSでの改行コード
-
異なるサーバのDBデータ同士を...
-
Accessのフィールド数が255しか...
-
FROM の中で CASE を使えるでし...
-
Accessのクエリでデータの入力...
おすすめ情報