アプリ版:「スタンプのみでお礼する」機能のリリースについて

下記のように外部結合と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テーブルを抽出したい
・実際は他にも抽出条件・参照テーブルはあります

A 回答 (4件)

たぶん、こんな感じで書けるような気がします。

(未テストですけど)

where decode(B.BBB(+),A.BBB,decode(A.AAA,0,1,0),0,decode(A.AAA,1,1,0),0)=1;
    • good
    • 2
この回答へのお礼

アドバイスありがとうございます。
明日、試してみます。取り急ぎお礼まで。

お礼日時:2006/10/20 00:52

#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するならばさらに複雑にしなくてはなりませんね。
    • good
    • 0
この回答へのお礼

再度アドバイスありがとうございます。
なるほど。解釈の方法は理解できました。
今回の仕様では
AAA=1のレコードのBBBはB表と関連がない値です。おまけにおっっしゃる通り、BBB=0のレコードがなくてもA表のレコードをSELECTしたいです。
今回は#1さんご提示の方法でいきたいと思います。
色々と勉強になりました。本当にありがとうございましたm(_)m

お礼日時:2006/10/22 16:02

テーブルの情報がないのと、条件を抜き出しているので想像まかせの


怪しげな回答になりますが…
※ちなみにエラー内容は「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) )
    • good
    • 1
この回答へのお礼

アドバイスありがとうございます。
・エラー内容はご提示の内容です。
・A表とB表の結合条件は項目BBB→その通りです。

最後の行の「A.AAA = 1 AND A.BBB = 0」がどうしても理解できずにいます。A.BBB = 0である必要はない気がするのですが・・。
理解不足で申し訳ないですm(_)m

お礼日時:2006/10/21 12:55

SELECT


A.*
FROM
A,
B
WHERE
(A.AAA = 0 AND A.BBB = B.BBB(+)) OR <== ★
(A.AAA = 1 AND B.BBB(+) = 0))

★の行の括弧"("が余分だったりしませんか?
    • good
    • 1
この回答へのお礼

アドバイスありがとうございます。
この後にANDで他の条件が続きます。。

お礼日時:2006/10/20 00:51

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す


このQ&Aを見た人がよく見るQ&A