从多个字段与其他表中的选择子查询匹配的表中删除

Osk*_*son 3 mysql delete subquery select

我想删除表中的一个条目,其中多个字段与另一个选择子查询的结果相匹配,该查询从另一个表中获取数据。

这是我到目前为止所拥有的,尽管它不起作用:

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 = ?
   )
Run Code Online (Sandbox Code Playgroud)

Rol*_*DBA 6

也许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 = ?;
Run Code Online (Sandbox Code Playgroud)

我写了一篇关于为什么DELETEWHERE涉及的子查询是有点不健康的过去后,处理的矿山上背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;
Run Code Online (Sandbox Code Playgroud)

建议

也许索引会有所帮助

ALTER TABLE table1 ADD INDEX id123 (id,field1,field2,field3);
ALTER TABLE table2 ADD INDEX id123 (id,field1,field2,field3);
Run Code Online (Sandbox Code Playgroud)

试一试 !!!

  • @Pacerier 如果它在 SQL 标准中, - 根据定义 - 它没有错;) (2认同)