删除重复的电子邮件记录

Delete duplicate email records

我们需要编写一个 SQL 查询来删除名为 Person 的 table 中所有重复的电子邮件条目,仅保留基于其最小 ID 的唯一电子邮件。

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+

Id 是此 table 的主键列。

例如,在运行查询后,上面的Person table应该有如下几行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+

注意:执行SQL后输出的是整个人table。需要使用delete语句。

这是我的答案:

delete Person
from Person p
left join 
    (select Id, Email 
     from
         (select 
              Id, Email,
              ROW_NUMBER() OVER(PARTITION BY Email ORDER BY Id) AS row_num
          from Person) as temp
     where row_num = 1) as temptwo on p.Id = temptwo.Id
where 
    temptwo.Id is null

但是在我 运行 我的查询之后,它一直告诉我这一行有一个语法错误:

ROW_NUMBER() OVER(PARTITION BY Email ORDER BY Id) AS row_num

谁能告诉我怎么了?

您可以只使用:

with todelete as (
      select p.*,
             ROW_NUMBER() OVER (PARTITION BY Email ORDER BY Id) AS seqnum
      from Person p
     ) 
delete from todelete
    where seqnum > 1;

也就是说,SQL 服务器支持 updatable CTE(以及子查询和视图),因此您不需要计算和连接回 table。

编辑:

在 MySQL 中,您将使用:

delete p
    from p join
         (select email, min(id) as min_id
          from person pp
          group by email
         ) pp
         on p.email = pp.email and p.id > p.min_id;

试试这个:

SELECT Main.ID,Main.EmaIl_ID 来自 @Tab Main 内部联接 ( SELECT MIN(ID) AS MIN_ID,Email_ID 来自@Tab 按 Email_ID) 分组 Main.ID=SUB.MIN_ID 按 Main.ID

排序

希望此代码适用于您的情况。