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)
也许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)
我写了一篇关于为什么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;
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)
归档时间: |
|
查看次数: |
29782 次 |
最近记录: |