- ベストアンサー
複数の表の条件でのDELETE文
- Oracleを使用している場合、複数の表を結合した条件でDELETE文を書く方法がわからない場合、ご教授ください。
- A表とB表があり、A.name=B.nameかつA.age=B.ageかつA.gender=B.gender以外のレコードをA表から削除したい場合、どのようなSQL文を書けば良いでしょうか。
- 複数の表を結合した条件でDELETE文を書きたい場合、例えばA表からjohn以外のレコードを削除する方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんにちわ。 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
その他の回答 (1)
- muyoshid
- ベストアンサー率72% (230/318)
こんにちわ。 #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
お礼
早速のご回答ありがとうございます。 教えていただいたとおりで実行できました。 where (a,b) in ~という書き方を知りませんでした。 勉強になりました。 ありがとうございました。