dポイントプレゼントキャンペーン実施中!

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

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

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

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

A 回答 (3件)

>検索結果は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))

でしょうか。
    • good
    • 0

仮に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形式が使えないことが
あります。バージョンを記載するとよいでしょう。
    • good
    • 0

SELECT * FROM Aテーブル


MINUS
(SELECT * FROM Bテーブル
UNION
SELECT * FROM Cテーブル
)
    • good
    • 0

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