【问题标题】:Why use subquery to get the original table?为什么要使用子查询来获取原始表?
【发布时间】:2019-01-29 21:37:44
【问题描述】:

我遇到了 Leetcode 的一个问题。

https://leetcode.com/problems/delete-duplicate-emails/

一种方法如下:

DELETE FROM Person WHERE Id NOT IN (SELECT MIN(p.Id) FROM (SELECT * FROM Person) p Group by p.Email);

我想知道为什么它需要表本身的子查询(SELECT MIN(p.Id) FROM (SELECT * FROM Person) 而不仅仅是(SELECT MIN(p.Id) FROM Person p)

【问题讨论】:

    标签: mysql sql subquery


    【解决方案1】:

    这是 MySQL 中的一个 hack。 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;
    

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 2017-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-18
      • 2018-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多