前言
当我们的项目上线后就会发现用户并不会按照预想设想的方式去使用,因此提前设置好的检查代码并不会完全拦住用户的违规操作。因此,经常会出现重复的数据。而对于我正在维护的项目来说,一旦出现重复数据就是致命的问题,因为他要进行金额的核算。因此掌握sql查重、去重的操作是必备的。
PS:接手这个项目要做的第一个任务就是查询导入数据的时候出现了重复。
一、sql查重
重复数据分为两种情况:一是,整条数据一摸一样包括id,当然这种情况很少出现;二是,用来判断数据唯一性的字段出现了重复,比如存储人员信息的表格中姓名和身份证号码出现了两条数据,导致在计算该用户的金额的时候系统报错
SELECT name, id_card,count(*) as num
FROM user
WHERE 1=1 GROUP BY name,id_card HAVING count(*)>1;
select出的只能是group by分组的字段,这个的原因大概是因为其他字段有不重复的无法判断出应该显示哪个字段.
使用该语句就可显示出重复的数据,主要利用的是group by 分组的功能对指定字段进行分组
二、sql去重
查出重复数据后就要对重复数据进行清除,但是我们还需保留一条数据用于后续的操作处理,因此去重时还要保留一条数据
delete from user a where (a.name, a.id_card) in (
select name, id_card
from user
group by name,id_card
having count(*) >1
) and rowid not in (
select max(rowid)
from user
group by name,id_card
having count(*) >1
)
通过name,id_card 字段进行判断是否为重复数据,又利用rowid保存一条数据(通过max() 函数可以保留较大的rowid的数据,利用min() 函数就可以保留较小的rowid的数据),因此达到了去重留一的目的
个人理解可能错误,望诸位评论区纠正!!