我遇到了 Leetcode 的问题。
https://leetcode.com/problems/delete-duplicate-emails/
一种方法如下:
从 Person WHERE 中删除
Id NOT IN (SELECT MIN(p.Id) FROM (SELECT * FROM Person) p
按 p.Email 分组);
我想知道为什么它需要表本身的子查询 (SELECT MIN(p.Id) FROM (SELECT * FROM Person)
而不是 (SELECT MIN(p.Id)来自人 p)
最佳答案
这是对 MySQL 的破解。 MySQL 不允许DELETE
或UPDATE
直接引用被修改的表。额外的子查询具体化表并允许代码工作。
许多人会改用 JOIN
来写:
DELETE p
FROM Person p JOIN
(SELECT p2.email, MIN(p2.ID) as min_id
FROM person p2
GROUP BY p2.email
) pp
ON pp.email = p.email
WHERE p.id > pp.id;
关于mysql - 为什么要用子查询来获取原表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54429981/