如何根据某个字段从数据库表中删除重复项

Posted

技术标签:

【中文标题】如何根据某个字段从数据库表中删除重复项【英文标题】:how to delete duplicates from a database table based on a certain field 【发布时间】:2011-02-10 00:45:03 【问题描述】:

我有一张桌子不知何故被复制了。我基本上想删除所有重复的记录,这些记录由我的表中名为 SourceId 的字段定义。每个来源 ID 应该只有一条记录。

是否有任何我可以编写的 SQL 将删除每个重复项,因此我每个 Sourceid 只有一条记录?

【问题讨论】:

您指的是任何特定版本的 SQL 吗? 【参考方案1】:

假设您有一个列 ID 可以打破重复的 sourceid,您可以使用它。使用 min(id) 会导致它只保留每个 sourceid 批次的 min(id)。

delete from tbl
where id NOT in
(
select  min(id)
from tbl
group by sourceid
)

【讨论】:

我不认为这是正确的。如果一个 id 是来自其他 sourceid 的 min(id),它可能会出现在子查询中。我认为你需要一个相关的子查询只是你正在寻找的 min(id)。 @Walter 这里的假设是 ID 在整个表格中是唯一的。【参考方案2】:
delete from table
where pk in (
select i2.pk
from table i1
  inner join table i2
   on i1.SourceId = i2.SourceId
)

好的做法是从 select * from … 以后才替换为delete from …

【讨论】:

以上是关于如何根据某个字段从数据库表中删除重复项的主要内容,如果未能解决你的问题,请参考以下文章

Oracle中如何删除重复数据

查询及删除重复记录

如何在从多个表中获取多行的同时删除 sql JOIN 中的重复项

如何根据 SQL Server 中的某个列删除重复项? [复制]

根据一列删除重复项并根据另一表中的数据进行过滤

从Google BigQuery中的嵌套表中删除重复项