web-dev-qa-db-ja.com

複数のフィールドが他のテーブルの選択サブクエリと一致するテーブルから削除する

複数のフィールドが別のテーブルからデータを取得する別の選択サブクエリの結果と一致するテーブルのエントリを削除したい。

これは私がこれまで持ってきたものですが、うまくいきません:

DELETE FROM table1
WHERE table1.id IN
   (SELECT id
   FROM table1 a JOIN table2 b
   ON a.field1 = b.field1
   AND a.field2 = b.field2
   AND a.field3 = b.field3
   AND b.id = ?
   )
3
Oskar Persson

おそらくDELETE JOINが望ましいでしょう

DELETE A.* FROM table1 A INNER JOIN table2 b
ON  A.id = B.id
AND a.field1 = b.field1
AND a.field2 = b.field2
AND a.field3 = b.field3
AND b.id = ?;

サブクエリを含むDELETEWHEREFeb 22, 2011に戻った過去の私の投稿で対処するのに少し不健康である理由について書きました: MySQLサブクエリの問題

クエリオプティマイザーの改善には大きな進歩がありましたが、サブクエリの評価により、ダウンストリームのキー比較でキーを使用できなくなる可能性があります。

代替

削除する必要があることがわかっているキーを集めて、DELETE JOINを実行してください。

CREATE TABLE DeleteIDs SELECT id FROM table1 WHERE 1=2;
INSERT INTO table1
    SELECT A.id FROM table1 A INNER JOIN table2 b
    ON  A.id = B.id
    AND a.field1 = b.field1
    AND a.field2 = b.field2
    AND a.field3 = b.field3
    AND b.id = ?
;
ALTER TABLE DeleteIDs ADD PRIMARY KEY (id);
DELETE B.* FROM DeleteIDs A INNER JOIN table1 B;
DROP TABLE DeleteIDs;

提案

多分インデックスが役立つでしょう

ALTER TABLE table1 ADD INDEX id123 (id,field1,field2,field3);
ALTER TABLE table2 ADD INDEX id123 (id,field1,field2,field3);

試してみる !!!

6
RolandoMySQLDBA