• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:複数の表の条件でのDELETE文)

複数の表の条件でのDELETE文

このQ&Aのポイント
  • Oracleを使用している場合、複数の表を結合した条件でDELETE文を書く方法がわからない場合、ご教授ください。
  • A表とB表があり、A.name=B.nameかつA.age=B.ageかつA.gender=B.gender以外のレコードをA表から削除したい場合、どのようなSQL文を書けば良いでしょうか。
  • 複数の表を結合した条件でDELETE文を書きたい場合、例えばA表からjohn以外のレコードを削除する方法を教えてください。

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

  • ベストアンサー
  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.1

こんにちわ。 Oracle8i (R8.1.7) でちょっと確認してみました。 以下、確認結果です。 SQL> select * from tableA; NAME AGE GENDER HOBBY -------- ---------- -------- -------- tom 15 male music john 23 male car kate 8 female tv SQL> select * from tableB; NAME AGE GENDER -------- ---------- -------- john 23 male kate 32 female SQL> delete from tableA where (name, age) not in (select name, age from tableB); 2行が削除されました。 SQL> select * from tableA; NAME AGE GENDER HOBBY -------- ---------- -------- -------- john 23 male car

lucasi
質問者

お礼

早速のご回答ありがとうございます。 教えていただいたとおりで実行できました。 where (a,b) in ~という書き方を知りませんでした。 勉強になりました。 ありがとうございました。

その他の回答 (1)

  • muyoshid
  • ベストアンサー率72% (230/318)
回答No.2

こんにちわ。 #1 のmuyoshid です。 #1 の回答を補足します。 #1 のように、not in 演算子を使用すると、tableA, tableB 共に Full table scan が行われます。 tableB のname, age 列に対して索引が定義されている場合は、以下のように not exists 演算子を使う事で索引を使用した検索を行う事もできます。 場合によって使い分けて下さい。 ※ table のアクセス方法については、SQL TRACE を採取するか、explain plan   で確認できます。 SQL> select * from tableA; NAME AGE GENDER HOBBY -------- ---------- -------- -------- tom 15 male music john 23 male car kate 8 female tv SQL> select * from tableB; NAME AGE GENDER -------- ---------- -------- john 23 male kate 32 female SQL> delete from tableA where not exists    (select NULL from tableB where tableA.name = tableB.name     and tableA.age = tableB.age); 2行が削除されました。 SQL> select * from tableA; NAME AGE GENDER HOBBY -------- ---------- -------- -------- john 23 male car

関連するQ&A