mysql - 为什么要用子查询来获取原表?

标签 mysql sql subquery

我遇到了 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 不允许DELETEUPDATE 直接引用被修改的表。额外的子查询具体化表并允许代码工作。

许多人会改用 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/

相关文章:

java - 如何编写查询以获取一周前在 JPA 中创建的记录

mysql - 使用多个 JOINS 时出错

sql - MySQL自动存储每行的日期时间

java - 无法访问 Spring H2 控制台

mysql - 使用有效但失败,为什么?

php - 如何循环遍历多个 MySQL 列并返回单行结果?

Mysql更新失败,有子查询

mysql - 使用子查询上的左连接和最大值来加速 mysql 查询

mysql - 难以掌握 MySQL 的函数依赖概念

php - 在MySQL中,需要连接两个表,其中一个表对第二个表有多个引用