
下記のように外部結合とOR条件を同時に使用するとエラーになってしまいます。
FROM句で記述する必要があると思いますが、
下記と同様の仕様を実現するにはどう書けばよいでしょうか?
アドバイスお願いします。
SELECT
A.*
FROM
A,
B
WHERE
((A.AAA = 0 AND A.BBB = B.BBB(+)) OR
(A.AAA = 1 AND B.BBB(+) = 0))
●実現したいこと
A.AAAが0の場合:A.BBB= B.BBBのデータ または
A.AAAが1の場合:B.BBB=0のデータを抽出したい
●前提
・Bテーブルに存在しなくともAテーブルを抽出したい
・実際は他にも抽出条件・参照テーブルはあります
No.4
- 回答日時:
#3です。
karen237さんの提示した条件に以下の表現があります。
A.AAA = 1 AND B.BBB(+) = 0
ここから、以下のように推測しました。
1.A.AAA=1の場合に結合されるB表のレコードはB.BBB=0。
2.A表とB表の結合条件は 項目BBBの前提ですので、B.BBB=0はすなわちA.BBB=0
ただし、データとしてA表のAAA=0のレコードについてはBBBがB表との結合値として有効であるが、
AAA=1のレコードのBBBはB表と関連がない値であるならば私の提示した回答では解決しません。
(文章ではややこしいですが、下記の状態で、A表のレコード(1)(2)ともB表の(1)と結合するということ)
A表
AAA BBB
(1) 1 0
(2) 1 9
B表
BBB CCC
(1) 0 データ0
それであれば素直にA.AAA=0の場合と1の場合とでSELECT文を分けて、UNIONすべきかもしれません。
とすると、以下のようにできますか?ただし、これだとB表に必ずBBB=0のレコードがある必要があります。
(B.BBB (+) = 0としてもだめだと思います)
SELECT A.… FROM A,B WHERE A.AAA = 0 AND A.BBB=B.BBB(+)
UNION ALL
SELECT A.… FROM A,B WHERE A.AAA = 1 AND B.BBB = 0
質問文には「Bテーブルに存在しなくともAテーブルを抽出したい」とあり、BBB=0のレコードがなくても
A表のレコードをSELECTするならばさらに複雑にしなくてはなりませんね。
再度アドバイスありがとうございます。
なるほど。解釈の方法は理解できました。
今回の仕様では
AAA=1のレコードのBBBはB表と関連がない値です。おまけにおっっしゃる通り、BBB=0のレコードがなくてもA表のレコードをSELECTしたいです。
今回は#1さんご提示の方法でいきたいと思います。
色々と勉強になりました。本当にありがとうございましたm(_)m
No.3
- 回答日時:
テーブルの情報がないのと、条件を抜き出しているので想像まかせの
怪しげな回答になりますが…
※ちなみにエラー内容は「ORA-01719: ORまたはINオペランドの中で
外部結合演算子(+)は使用できません」ですよね?
原則として、A表とB表の結合条件は項目BBBのように見えますがいかが
でしょうか。それを前提とすると、以下のように記述できそうです。
(2行目は実質的にB.BBB(+) = 0になりますよね。)
( ( A.AAA = 0 AND A.BBB = B.BBB(+)) OR
( A.AAA = 1 AND A.BBB = 0 AND A.BBB = B.BBB(+)) )
他にも条件があるようですが、この部分のみで考えると以下のように
整理可能で、そもそも外部結合(+)をORに入れる必要がないと分かります。
A.BBB = B.BBB(+) AND
( A.AAA = 0 OR (A.AAA = 1 AND A.BBB = 0) )
アドバイスありがとうございます。
・エラー内容はご提示の内容です。
・A表とB表の結合条件は項目BBB→その通りです。
最後の行の「A.AAA = 1 AND A.BBB = 0」がどうしても理解できずにいます。A.BBB = 0である必要はない気がするのですが・・。
理解不足で申し訳ないですm(_)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
単一グループのグループ関数ではありません。
Oracle
-
CSVファイルの中で、「 , 」カンマを使いたい
その他(コンピューター・テクノロジー)
-
ORA-01843: 指定した月が無効です。エラー
Oracle
-
-
4
Statement ignored というエラー
Oracle
-
5
SI Object Browserのテーブルスクリプト出力のやり方
その他(データベース)
-
6
CASE文のエラーについて
Oracle
-
7
SQL*LoaderでCSVから指定した列のみインポートしたい。
Oracle
-
8
MAX関数を使ってからLEFT JOINしたいのですが・・
PHP
-
9
【PL/SQL】FROM区に変数を使う方法
Oracle
-
10
FROM の中で CASE を使えるでしょうか
SQL Server
-
11
sqlplusでヘッダーが付かない
Oracle
-
12
固定値を含む結合と複数テーブルの結合について
Oracle
-
13
select句副問い合わせ 値の個数が多すぎます
Oracle
-
14
group byの並び順を変えるだけで結果が異なる
Oracle
-
15
実行時エラー 3265「要求された名前、または序数
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select句副問い合わせ 値の個...
-
SQLの書き方(チェックボックス)
-
select insertで複数テーブルか...
-
COUNTの取得方法(?)について...
-
外部結合とor条件混在の記述方法
-
MERGE文を単体テーブルに対して...
-
DELETE 文とEXISTSの使い方につ...
-
unionの結果は集計はできないで...
-
3つのテーブルからの抽出SQL
-
unionでマージした副問合せを結合
-
AccessからOracleへの外部結合
-
select文でフリーズします。
-
oracleの分割delete
-
他のテーブルを参照した値はupd...
-
半角英数字混在データから数字...
-
集計後の数値が倍になる
-
構成比を求めるSQL文につきまして
-
OracleのSQL*PLUSで、デー...
-
Oracleでの文字列連結サイズの上限
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
GROUP BYを行った後に結合した...
-
select insertで複数テーブルか...
-
select句副問い合わせ 値の個...
-
SELECTの結果で同一行を複数回...
-
MERGE文を単体テーブルに対して...
-
SQL GROUPで件数の一番多いレコ...
-
unionでマージした副問合せを結合
-
外部結合とor条件混在の記述方法
-
複数テーブルのMAX値の行データ...
-
固定値を含む結合と複数テーブ...
-
結合と副問い合わせの違い
-
oracleの分割delete
-
他のテーブルを参照した値はupd...
-
SET句内で複数の条件を指定して...
-
SQLの書き方(チェックボックス)
-
集計後の数値が倍になる
-
unionの結果は集計はできないで...
-
COUNTの取得方法(?)について...
-
SQLでの絞り込み検索
-
最大値の取得
おすすめ情報