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

解決済みの質問

テーブル参照について

お世話になります。
AテーブルとBテーブルを比較し、Aテーブルにしかないデータ一覧を表示するSQL文を作成しました。

SELECT * FROM Aテーブル
WHERE NOT EXISTS(SELECT * FROM Bテーブル
WHERE CODE=Aテーブル.CODE AND NAME=Bテーブル.NAME)

下記の場合はどのように記述すればいいのでしょうか?
検索結果はAテーブルに存在しているが、BテーブルまたはCテーブルには存在していないデータ。

以上よろしくお願いいたします。

投稿日時 - 2010-12-20 11:38:35

QNo.6395995

暇なときに回答ください

質問者が選んだベストアンサー

>検索結果はAテーブルに存在しているが、BテーブルまたはCテーブルには存在していないデータ。
というのは、
・BとCのどちらかに存在していれば検索対象外
・BとCの両方に存在していれば検索対象外
の2つの意味に取れますよね。

前者なら
SELECT * FROM テーブルA
WHERE (NOT EXISTS(SELECT * FROM Bテーブル
WHERE Bテーブル.CODE=Aテーブル.CODE AND Bテーブル.NAME=Aテーブル.NAME)
AND NOT EXISTS(SELECT * FROM Cテーブル
WHERE Cテーブル.CODE=Aテーブル.CODE AND Cテーブル.NAME=Aテーブル.NAME))

後者なら
SELECT * FROM テーブルA
WHERE (NOT EXISTS(SELECT * FROM Bテーブル
WHERE Bテーブル.CODE=Aテーブル.CODE AND Bテーブル.NAME=Aテーブル.NAME)
OR NOT EXISTS(SELECT * FROM Cテーブル
WHERE Cテーブル.CODE=Aテーブル.CODE AND Cテーブル.NAME=Aテーブル.NAME))

でしょうか。

投稿日時 - 2010-12-20 13:21:50

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

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

回答(3)

ANo.2

仮にCODEがNULL不許可だとします。

SELECT A.* FROM Aテーブル A
LEFT JOIN Bテーブル B ON A.CODE=B.CODE
LEFT JOIN Cテーブル C ON A.CODE=C.CODE
WHRE B.CODE IS NULL OR C.CODE IS NULL

最後のWHERE句は「Bに無いか、Cに無い」です。
もし、「B、Cともに無い」ならば条件式をAND結合
にするか、サブクエリを使う下記の書式があります。

SELECT X.* FROM
(SELECT A.* FROM Aテーブル A
LEFT JOIN Bテーブル B ON A.CODE=B.CODE
WHERE B.CODE IS NULL) X
LEFT JOIN Cテーブル C ON X.CODE=C.CODE
WHERE C.CODE IS NULL

サブクエリを使う方が速度が速いはずです。特に
元のデータが多く、対象データが少ない場合には
効果が大きくなります。これはCテーブルと結合
させる時点で、レコードが絞り込まれているから
です。

上記はANSI形式なので、他のDBシステムでも
使えるSQL文です。(Oracle固有の式は無い)
但し、バージョンによりANSI形式が使えないことが
あります。バージョンを記載するとよいでしょう。

投稿日時 - 2010-12-20 12:50:55

ANo.1

SELECT * FROM Aテーブル
MINUS
(SELECT * FROM Bテーブル
UNION
SELECT * FROM Cテーブル
)

投稿日時 - 2010-12-20 11:55:06

あなたにオススメの質問