千万级数据库(MSSQL)删除重复记录
2016-05-25 18:39
483 查看
在抓取数据后对数据进行操作的途中,有时候会碰到重复数据,重复数据有时候会导致了数据库部分设置不能正确设置,所以就要进行筛选。
首先,有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
对于第一种重复,比较容易解决,使用:
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除:
select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp
对于第二种重复,我们需要使用以下这种方法,假设重复字段为Mobile和UnitName:
select * from tableName
where [Mobile] in (select [Mobile] from info_user_a group by [Mobile] having count([Mobile])>1)
and id not in (select min(id) from info_user_a group by [Mobile] having count([Mobile])>1)
and [UnitName] in (select [UnitName] from info_user_a group by [UnitName] having count([UnitName])>1)
and id not in (select min(id) from info_user_a group by [UnitName] having count([UnitName])>1)
这样是得到了重复的数据,如果想要删除,只需把开头的select *改成delete即可。
接下来是重点,如果数据库真的有一千万,或者上千万,千万别直接对整个库进行操作,好点的办法就是把一个库分成多个,比如原先有1000W,就分成10个100W,然后分别对这10个100W的库操作,不过如果真的有上千万的数据,建议还是改用oracle数据库比较好,我用sql server 2008感觉上都有点吃不消,而且还是双核酷睿CPU,可能是内存有点小,只有2G。
方法还有很多,这只是其中一种而已,希望对读者您有帮助。
首先,有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如Name字段重复,而其他字段不一定重复或都重复可以忽略。
对于第一种重复,比较容易解决,使用:
select distinct * from tableName
就可以得到无重复记录的结果集。
如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除:
select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp
对于第二种重复,我们需要使用以下这种方法,假设重复字段为Mobile和UnitName:
select * from tableName
where [Mobile] in (select [Mobile] from info_user_a group by [Mobile] having count([Mobile])>1)
and id not in (select min(id) from info_user_a group by [Mobile] having count([Mobile])>1)
and [UnitName] in (select [UnitName] from info_user_a group by [UnitName] having count([UnitName])>1)
and id not in (select min(id) from info_user_a group by [UnitName] having count([UnitName])>1)
这样是得到了重复的数据,如果想要删除,只需把开头的select *改成delete即可。
接下来是重点,如果数据库真的有一千万,或者上千万,千万别直接对整个库进行操作,好点的办法就是把一个库分成多个,比如原先有1000W,就分成10个100W,然后分别对这10个100W的库操作,不过如果真的有上千万的数据,建议还是改用oracle数据库比较好,我用sql server 2008感觉上都有点吃不消,而且还是双核酷睿CPU,可能是内存有点小,只有2G。
方法还有很多,这只是其中一种而已,希望对读者您有帮助。
相关文章推荐
- 常用的获取时间差的sql语句
- Sqlite增删改查(一)
- 经典SQL语句集锦(收藏版)
- .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(四)
- 实时数据库中的数据压缩技术
- .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(三)
- .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(二)
- .Net 站点在Windows环境借助Nginx和Redis实现负载均衡系列(一)
- SQLite增删改查小结(二):
- CentOS-6上安装二进制Mariadb
- Java 连接Oracle的问题
- SQLite的基本使用
- mysql 密码变更变化(2)
- CentOS系统配置redis
- mysql-insert-Duplicate
- Mysql数据库的基本概念和架构
- java aop redis缓存
- 学习redis-安装和基本一些命令
- mysql根据身份证查询年龄,地址,性别
- NoSQL数据库性能比较:MongoDB、Redis、Tokyo Tyrant