SQL 删除重复记录

SQL 删除重复记录,你想删除一个表里的重复记录,考虑如下的表。

SQL 删除重复记录 问题描述

你想删除一个表里的重复记录,考虑如下的表。

create table dupes (id integer, name varchar(10))
 
insert into dupes values (1, 'NAPOLEON')
insert into dupes values (2, 'DYNAMITE')
insert into dupes values (3, 'DYNAMITE')
insert into dupes values (4, 'SHE SELLS')
insert into dupes values (5, 'SEA SHELLS')
insert into dupes values (6, 'SEA SHELLS')
insert into dupes values (7, 'SEA SHELLS')
 
select * from dupes order by 1
 
        ID NAME
---------- ----------
         1 NAPOLEON
         2 DYNAMITE
         3 DYNAMITE
         4 SHE SELLS
         5 SEA SHELLS
         6 SEA SHELLS
         7 SEA SHELLS

对于每一组重复的名字,例如 SEA SHELLS,你希望保留任意一个 ID,并删除其余的。不论删除 5 和 6,或者 5 和 7,或者 6 和 7,最终你只想要一条 SEA SHELLS 记录。

SQL 删除重复记录 解决方案

使用子查询和诸如 MIN 这样的聚合函数,任意选择并保留一个 ID(本例中 NAME 相同的情况下只有最小的 ID 会被保留)。

1  delete from dupes
2   where id not in ( select min(id)
3                       from dupes
4                      group by name )

SQL 删除重复记录 扩展知识

如果要删除重复记录,首先要明确两行数据在什么条件下才会被认为是“重复的记录”。就本实例而言,“重复的记录”是指它们的 NAME 列含有相同的值。确立了这样的定义之后,还要看一下能区分重复行的其他列,以便决定要保留的记录。最理想的状况是能区分重复行的那个列(或者那几列)是主键。在这里我选择了 ID 列,因为任意两条记录都不会有重复的 ID
这个解决方案的关键之处在于按照重复值(本例中是 NAME)分组,并使用聚合函数找出一个将要保留的值。对于本解决方案而言,子查询会返回最小的 ID,其代表了不会被删除的行。

select min(id)
  from dupes
 group by name
 
    MIN(ID)
----------
         2
         1
         5
         4

然后,DELETE 语句会删除上述子查询返回值之外的所有 ID(本例中会删除的 ID 是 3、6 和 7)。为了能更好地理解上述子查询是如何运行的,不妨在 SELECT 列表里再加上 NAME 列。

select name, min(id)
  from dupes
 group by name
 
NAME          MIN(ID)
---------- ----------
DYNAMITE            2
NAPOLEON            1
SEA SHELLS          5
SHE SELLS           4

上述子查询返回的结果集就是将要被保留的行。DELETE 语句里的 NOT IN 谓词会删除其他行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程