• ベストアンサー

テーブル参照について

お世話になります。 AテーブルとBテーブルを比較し、Aテーブルにしかないデータ一覧を表示するSQL文を作成しました。 SELECT * FROM Aテーブル WHERE NOT EXISTS(SELECT * FROM Bテーブル WHERE CODE=Aテーブル.CODE AND NAME=Bテーブル.NAME) 下記の場合はどのように記述すればいいのでしょうか? 検索結果はAテーブルに存在しているが、BテーブルまたはCテーブルには存在していないデータ。 以上よろしくお願いいたします。

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

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.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)) でしょうか。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.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形式が使えないことが あります。バージョンを記載するとよいでしょう。

  • SaKaKashi
  • ベストアンサー率24% (755/3136)
回答No.1

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