SQL 删除重复记录,你想删除一个表里的重复记录,考虑如下的表。
SQL 删除重复记录 问题描述
你想删除一个表里的重复记录,考虑如下的表。
对于每一组重复的名字,例如 SEA SHELLS
,你希望保留任意一个 ID
,并删除其余的。不论删除 5 和 6,或者 5 和 7,或者 6 和 7,最终你只想要一条 SEA SHELLS
记录。
SQL 删除重复记录 解决方案
使用子查询和诸如 MIN
这样的聚合函数,任意选择并保留一个 ID
(本例中 NAME
相同的情况下只有最小的 ID
会被保留)。
SQL 删除重复记录 扩展知识
如果要删除重复记录,首先要明确两行数据在什么条件下才会被认为是“重复的记录”。就本实例而言,“重复的记录”是指它们的 NAME
列含有相同的值。确立了这样的定义之后,还要看一下能区分重复行的其他列,以便决定要保留的记录。最理想的状况是能区分重复行的那个列(或者那几列)是主键。在这里我选择了 ID
列,因为任意两条记录都不会有重复的 ID
。
这个解决方案的关键之处在于按照重复值(本例中是 NAME
)分组,并使用聚合函数找出一个将要保留的值。对于本解决方案而言,子查询会返回最小的 ID
,其代表了不会被删除的行。
然后,DELETE
语句会删除上述子查询返回值之外的所有 ID
(本例中会删除的 ID
是 3、6 和 7)。为了能更好地理解上述子查询是如何运行的,不妨在 SELECT
列表里再加上 NAME
列。
上述子查询返回的结果集就是将要被保留的行。DELETE
语句里的 NOT IN
谓词会删除其他行。