删除重复的电子邮件记录

Viv*_*ang 0 sql sql-server sql-delete

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

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
| 3  | john@example.com |
+----+------------------+
Run Code Online (Sandbox Code Playgroud)

Id是该表的主键列。

例如,运行查询后,上Person表应具有以下行:

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | john@example.com |
| 2  | bob@example.com  |
+----+------------------+
Run Code Online (Sandbox Code Playgroud)

注意:执行SQL后输出的是整个Person表。需要使用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
Run Code Online (Sandbox Code Playgroud)

但在我运行查询后,它不断告诉我此行存在语法错误:

ROW_NUMBER() OVER(PARTITION BY Email ORDER BY Id) AS row_num
Run Code Online (Sandbox Code Playgroud)

有人能告诉我出了什么问题吗?

Gor*_*off 6

你可以只使用:

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;
Run Code Online (Sandbox Code Playgroud)

也就是说,SQL Server 支持可更新的 CTE(以及子查询和视图),因此您不需要计算并连接回表。

编辑:

在 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;
Run Code Online (Sandbox Code Playgroud)