- ベストアンサー
外部結合とor条件混在の記述方法
下記のように外部結合と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テーブルを抽出したい ・実際は他にも抽出条件・参照テーブルはあります
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
たぶん、こんな感じで書けるような気がします。(未テストですけど) where decode(B.BBB(+),A.BBB,decode(A.AAA,0,1,0),0,decode(A.AAA,1,1,0),0)=1;
その他の回答 (3)
- xKENx
- ベストアンサー率65% (21/32)
#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
- xKENx
- ベストアンサー率65% (21/32)
テーブルの情報がないのと、条件を抜き出しているので想像まかせの 怪しげな回答になりますが… ※ちなみにエラー内容は「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
- entree
- ベストアンサー率55% (405/735)
SELECT A.* FROM A, B WHERE (A.AAA = 0 AND A.BBB = B.BBB(+)) OR <== ★ (A.AAA = 1 AND B.BBB(+) = 0)) ★の行の括弧"("が余分だったりしませんか?
お礼
アドバイスありがとうございます。 この後にANDで他の条件が続きます。。
お礼
アドバイスありがとうございます。 明日、試してみます。取り急ぎお礼まで。