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

Oracle8iを使用して複数の表から特定のデータを抽出するSQL文を作っています。
【表A】
KaiinID | Name
-----------------
11111 | aaaaa
-----------------
22222 | bbbbb
-----------------
44444 | ddddd
-----------------
55555 | eeeee
-----------------

【表B】
KaiinID | Address
-------------------
11111 | address1
-------------------
44444 | address4
-------------------
66666 | address6
-------------------
77777 | address7
-------------------

【表C】
KaiinID | Memo
-----------------
11111 | Memo1
-----------------
22222 | Memo2
-----------------
33333 | Memo3
-----------------
66666 | Memo6
-----------------

【欲しい結果】
KaiinID
--------
44444

『A,B,Cの表のうちCのみに存在しないKaiinID』を検索するSQL文を実行したところ、以下のエラーが表示されてしまいました。

Select A.KaiinID
From A,B,C
Where A.KaiinID=B.KaiinID and
A.KaiinID=C.KaiinID(+) and
B.KaiinID=C.KaiinID(+);

「3行でエラーが発生しました。
 ORA-01417:表が少なくとも1つの他の表に外部結合されている可能性があります。」

このエラーを見ても「外部結合されている可能性?確かにしてるけど・・・」
としかわかりません。

Select A.KaiinID
From A,B
Where A.KaiinID=B.KaiinID and
A.KaiinID not in (Select KaiinID From C);

ともしてみたのですが、こちらは実行した途端SQL*Plusが応答なしになってしまいました。
(実際の表にはA,B,Cそれぞれ300万件近いデータがあります)

どのようにすれば、『3つの表のうち1つの表のみに存在しないKaiinID』を取得できるのでしょうか?
御存知の方、教えてください!

A 回答 (1件)

1.not inではなく、not existsを使う



Select A.KaiinID
From A,B
Where A.KaiinID=B.KaiinID and
not exists (Select KaiinID From C where A.KaiinID = C.KaiinID );


2.A,Bを結合させた結果にminusを使う
Select A.KaiinID
From A,B
Where A.KaiinID=B.KaiinID
minus
Select KaiinID From C

どちらが速いかはわかりませんが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
1.のnot existsを実行すると応答なしになってしまったので
2.を実行したところ、結果が返ってきました!
minusは知らなかったので合わせてありがたい情報でした。

おかげで解決しました。
また機会がありましたら教えてください(ペコリ)。

お礼日時:2003/09/10 13:08

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

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