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)
有人能告诉我出了什么问题吗?
你可以只使用:
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)
| 归档时间: |
|
| 查看次数: |
1535 次 |
| 最近记录: |