• ベストアンサー

条件付DELEATE文について

条件付のDELETEをするときのSQL文ができません。 同じデータのあるテーブル(別テーブル)から データを削除したいのですが、上手くできません。 DELETE tbl_A.* FROM tbl_A INNER JOIN tbl_B ON tbl_A.field01 = tbl_B.field01"; このように書いたのですが、全てのデータが削除されてしまいます。 tbl_Bとtbl_Aにある共通するデータのみをtbl_Aから削除したいのですがどのように書けばよいのでしょうか? よろしくお願いします。

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

  • ベストアンサー
回答No.3

自表や他表を利用したupdateやdeleteは、RDBMSによる仕様差が多い部分です。 MySQLの場合は、次のような書き方ができます。 (削除対象の表名は、他表との結合のためにも使うので、2箇所で出てきます) -- 例1 delete t1 from t1 inner join t2 on t1.c1=t2.c1 ; -- 例2 delete t1 from t1,t2 where t1.c1=t2.c1 ; -- 例3 delete from t1 using t1,t2 where t1.c1=t2.c1 ; http://dev.mysql.com/doc/refman/5.1/ja/delete.html

kodomo1234
質問者

お礼

色々、勉強になりました。 DELETE文の参考URLを 教えて頂けて助かりました。 有難うございます。

kodomo1234
質問者

補足

chukenkenkou様 アドバイスを頂き、有難うございます。 上記の内容とURLを参考に実行したら、 できるようになりました。 有難うございました。

その他の回答 (2)

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.2

あっと、deleteの解説を十分読んでなかった。4.0以降は、結合(join含む)で複数table指定可能になってるのか。 問題は、on じゃなくてwhereで指定しないとtruncate(全行削除)になるってことだね。

kodomo1234
質問者

補足

hrm_mmm様 アドバイスを頂きまして、有難うございます。 教えて下さった構文を実行してみたところエラーとなりました。 以下エラー #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE field01 IN ( SELECT tbl_B.field01 FROM tbl_B' at line 1 何処がおかしいのでしょうか? よろしくお願いします。 DBバージョン:Mysql5以降です

  • hrm_mmm
  • ベストアンサー率63% (292/459)
回答No.1

join 構文は、select構文内でしか使えないと思ったけど、エラーも出さずに無視して実行しちゃうとは、deleteって危険な構文ですね。 とりあえず、mysql4.1以降でサブクエリが使えるなら、where条件にサブクエリを書けば出来そうです。 delete from tbl_A where field01 IN (SELECT tbl_B.field01 FROM tbl_B); 4.0以前だと、delete構文に関しては、1クエリでは無理です。

参考URL:
http://dev.mysql.com/doc/refman/4.1/ja/Rewriting_subqueries.html
kodomo1234
質問者

お礼

アドバイス有難うございました。