こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

Oracle8での外部結合

現在、oracle8.1.7で開発しています。

T1,T2,T3の3つのテーブルがあります。
T1のデータで、T3のテーブルにまだデータが存在しないものを検索しています。
それは既にできました。

次に、条件として、
 (1)T1のA,B,Cと一致し、かつFLGが5または9
 (2)T1のA,B,Cと一致するデータがない。
という2点を追加しました。
しかし、以下のようにFLGが1となっているものまで検索してしまいます。

  <T1>        <T2>      <T3>
A:あいうえお     A:あいうえお    データ無し
B:bbb        B:bbb
C:ccc        C:ccc
            FLG:1  

===SQL文==============================================================
SELECT A,DT1,DT2 FROM T1
WHERE A LIKE 'あ%'

---追加部分----
AND (
EXISTS (SELECT A FROM T2 WHERE A=T1.A AND B=T1.B AND C=T1.C AND FLG IN (5,9))
OR NOT EXISTS (SELECT A FROM T2 WHERE A=T1.A AND B=T1.B AND C=T1.C )
)
----ここまで----

AND NOT EXISTS (SELECT * FROM T3 WHERE KATAMEI='あ' AND NO=1)

どこがいけないのでしょうか?
よろしくお願いしますm(_ _)m

投稿日時 - 2002-12-20 11:10:28

QNo.432051

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

jmh

exists () の中身を、選択された T1 の行の値で実行してみたら、
分かると思います。
つまり、
(a) select * from T2 where A = 'あいうえお' and B = 'bbb' and C = 'ccc' and FLG in (5, 9)
(b) select * from T2 where A = 'あいうえお' and B = 'bbb' and C = 'ccc'
を実行して、
(a) で行が選択されれば、それが原因、
(b) で行が選択されなければ、それが原因…だと思います。

次の select の結果は、どうですか?
select * from T1, T2 where
T1.A like 'あ%'
and T1.A = T2.A(+)
and T1.B = T2.B(+)
and T1.C = T2.C(+)
and decode(T2.rowid, NULL, 'X', decode(T2.FLG, 5, 'X', 9, 'X')) = 'X'
and not exists (select 'X' from T3 where T3.KATAMEI = 'あ' and T3.NO = 1)

投稿日時 - 2003-01-07 00:15:47

ANo.1

追加条件の(1)と(2)をOrで判定していますが、
追加条件はFLGの値に関係なくA,B,Cの値が一致するものは
全て不成立のような気がしますが...。

NOT EXIST (SELECT A
FROM T2
WHERE A = T1.A
AND B = T1.B
AND C = T1.C
AND FLG NOT IN (5, 9))

この式じゃ駄目ですか?

投稿日時 - 2002-12-21 22:01:38

あなたにオススメの質問