最近遇到一个问题:就是公司的考勤记录总是会重复,考勤记录是我们的定时任务定时调用产生的,但是不知道怎么回事,定时任务总是会重复调用,产生了很多重复的记录,公司有300来人,没个人都重复的话,也就是有将近300条重复的记录,一条一条的来找,肯定不现实。
所以为了从根本上解决问题,就需要我在考勤记录表里面加上唯一性约束,根据员工ID和考勤日期来做唯一性约束,但是问题来了,在做唯一性约束之前,必须要确保在此约束之上没有重复的值,所以要找到之前的重复记录先删除,唯一性约束才有作用,分析到这里其实就是怎么写sql的问题了。
在此之前,我只写过一个表里面一个记录重复的记录查询,
select employee_id from table t1 group by employee_id having count(1)>1
这样就可以查询到employee_id出现大于一次的记录,那么两条记录重复的,也就可以同理写出来了
select * from table t1 where (t1.A,t1.B) in (select A,B from table group by A,B having count(*)>1)
执行之后发现这样的sql效率还是很高的,不到1s的时间,从10W数量级的数据中找到了我想要的数据,所以说写出好的sql,执行效率还是可以节省很多的时间!
![测试结果](http://img.blog.csdn.net/20150908202401205)