删除重复的电子邮件记录

问题描述 投票:0回答:2

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

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
| 3  | [email protected] |
+----+------------------+

Id是此表的主键列。

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

+----+------------------+
| Id | Email            |
+----+------------------+
| 1  | [email protected] |
| 2  | [email protected]  |
+----+------------------+

注:执行SQL后,输出是整个Person表。需要使用删除语句。

这是我的答案:

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

有人可以告诉我怎么了吗?

sql sql-server sql-delete
2个回答
2
投票

您可以使用:

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 Server支持可更新的CTE(以及子查询和视图),因此您无需计算并重新连接到表。


0
投票

尝试此:

SELECT Main.ID,Main.EmaIl_ID FROM @Tab Main内部联接 (SELECT MIN(ID)AS MIN_ID,Email_ID来自@TabGROUP BY Email_ID)SUB ON Main.ID = SUB.MIN_IDORDER BY Main.ID

希望此代码适合您的情况。

© www.soinside.com 2019 - 2024. All rights reserved.