我们需要编写一个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
有人可以告诉我怎么了吗?
您可以使用:
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(以及子查询和视图),因此您无需计算并重新连接到表。
尝试此:
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
希望此代码适合您的情况。