人生最悪の忘れ物

条件付の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から削除したいのですがどのように書けばよいのでしょうか?

よろしくお願いします。

A 回答 (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

この回答への補足

chukenkenkou様
アドバイスを頂き、有難うございます。

上記の内容とURLを参考に実行したら、
できるようになりました。

有難うございました。

補足日時:2009/09/23 18:40
    • good
    • 0
この回答へのお礼

色々、勉強になりました。
DELETE文の参考URLを
教えて頂けて助かりました。

有難うございます。

お礼日時:2009/09/23 18:45

あっと、deleteの解説を十分読んでなかった。

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

この回答への補足

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以降です

補足日時:2009/09/23 17:54
    • good
    • 0

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 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/09/23 18:43

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


おすすめ情報