複数のフィールドが別のテーブルからデータを取得する別の選択サブクエリの結果と一致するテーブルのエントリを削除したい。
これは私がこれまで持ってきたものですが、うまくいきません:
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 = ?
)
おそらく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 = ?;
サブクエリを含むDELETE
とWHERE
がFeb 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);