删除重复的电子邮件记录
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
排序
希望此代码适用于您的情况。
我们需要编写一个 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
排序希望此代码适用于您的情况。