SQL与重复记录

SQL语句
443
0
0
2022-05-09
标签   SQL语句

一、查询表中的重复记录,并显示其中一个最大或最小ID号的记录

方法一:对同一个表,命名两个名字来实现

select distinct a.id,a.lastname,a.firstname,a.address,a.city from persons as a,persons as b where a.id

这里讲persons表用两个名称来命名,分别命名为a表和b表,注意用as关键字来重命名。之后用这a表和b表两个表中的记录进行是否相等的比较,这里的相等用一个等号表示“=”,不相等用“!=”或者“<>”表示,大于号用“>”表示,小于号用“<”表示。因为Id的数据类型,我自定义为整形,所以可以比较大小。这里的id是主键,lastname,firstname,address,city都是字段。

方法二:用group BY来实现。

select * from persons where id in(select min(id) from persons group by lastname,firstname,address,city having count(*)>1)

这里分组的依据是每个字段(除了主键ID)之外,通过对每个字段进行相同的值取一个的道理,多个字段就构成的“与”即“and”的意思,所以就是找多个字段都相同的情况,那么要让他取一个记录,就取最大id号码或者最小ID号码,分别用函数max(id)和min(id)来获取,上例中用的是最小id获取方法。通过以上的例子我们得到在重复记录中获取一个记录的通用方法如下:

select * from 表名 where id in(select min(id) from 表名 group by 重复字段1,重复字段2,。。。,重复字段N having count(*)>1)

后面的having是结合函数COUNT(*),用来判断统计符合重复记录的个数的,如果记录数大于一,就是有重复的。

二、删除多余的行,值保留重复记录中的一个

只留重复记录中的一个的方法如下,这里选择ID号码最大的号码(max(id))留下:

delete persons where id not in(select max(id) from persons group by lastname,firstname,address,city),注意这里不能在后面加having count(*)>1,否则会全部删除。这里得到删除记录的一般模式:

delete 表名 where id not in(select max(id) from 表名 group by 重复字段1,重复字段2,。。。,重复字段N ) 这里要灵活应用。