Sql如何删除重复记录
类别:数据库 浏览量:600
时间:2014-6-25 Sql如何删除重复记录
Sql如何删除重复记录一、Sql产生重复记录的原因
1、完全重复的记录
完全重复的数据,通常是由于没有设置主键/唯一键约束导致的。
2、部分重复的记录
部分列重复的数据,通常表上是有主键的,可能是程序逻辑造成了多行数据列值的重复。
二、Sql删除重复记录的方法
1、删除完全重复的记录
(1) 借助临时表
利用DISTINCT得到单条记录,删除源数据,然后导回不重复记录。
如果表不大的话,可以把所有记录导出一次,然后truncate表后再导回,这样可以避免delete的日志操作。
例如
if OBJECT_ID('tempdb..#tmp') is not null
drop table #tmp
GO
select distinct * into #tmp
from duplicate_all
where c1 = 1
GO
delete duplicate_all where c1 = 1
GO
insert into duplicate_all
select * from #tmp
(2) 使用ROW_NUMBER
with tmp
as
(
select *,ROW_NUMBER() OVER(PARTITION BY c1,c2,c3 ORDER BY(getdate())) as num
from duplicate_all
where c1 = 1
)
delete tmp where num > 1
(3)、如果多个表有完全重复的行,可以考虑通过UNION将多个表联合,插到一个新的同结构的表,SQL Server会帮助去掉表和表之间的重复行。
2、删除部分重复的记录
(1) 唯一索引
唯一索引有个忽略重复建的选项,在创建主键约束/唯一键约束时都可以使用这个索引选项。
例如
if OBJECT_ID('tmp') is not null
drop table tmp
GO
create table tmp
(
c1 int,
c2 int,
c3 varchar(100),
constraint UQ_01 unique(c2,c3) with(IGNORE_DUP_KEY = ON)
)
GO
insert into tmp
select * from duplicate_col
select * from tmp
(2) 借助主键/唯一键来删除
通常会选择主键/唯一键的最大/最小值保留,其他行删除。以下只保留重复记录中c1最小的行。
delete from duplicate_col
where exists(select 1 from duplicate_col b where duplicate_col.c1 > b.c1 and (duplicate_col.c2 = b.c2 and duplicate_col.c3 = b.c3))
--或者
delete from duplicate_col
where c1 not in (select min(c1) from duplicate_col group by c2,c3)
(3) ROW_NUMBER
with tmp
as
(
select *,ROW_NUMBER() OVER(PARTITION BY c2,c3 ORDER BY(getdate())) as num
from duplicate_col
)
delete tmp where num > 1
select * from duplicate_col
标签:Sql
您可能感兴趣
- sqlserver表空间占用率(SQL Server获取磁盘空间使用情况)
- 常用sql语句大全总结(程序员最实用的 SQL 语句收藏,看完这篇就够了)
- mac的mysql连接问题如何解决(MAC 中mysql密码忘记解决办法)
- mysql安装详解(MySQL Router的安装部署)
- SQL中in和exists的区别
- pythonsql注入检测(Python版Mssql爆破小脚本)
- sqlserver百分比数据查询时间(SQL Server统计信息更新时采样百分比对数据预估准确性的影响详解)
- dedecms滚动代码(dedecms常用sql语句汇总)
- sqlserver表分区步骤(行转列之SQL SERVER PIVOT与用法详解)
- mysql8.0安装版安装详细教程(mysql 8.0.24版本安装配置方法图文教程)
- mysql权限设置
- 常见的mysql优化策略(MySQL pt-slave-restart工具的使用简介)
- 怎么把csv文件导入mysql(mysql导入csv的4种报错的解决方法)
- docker搭建mysql服务(Docker部署Mysql集群的实现)
- sql server事件跟踪器中常用的跟踪事件
- sqlserver恢复delete数据(SQL Server数据库的三种恢复模式:简单恢复模式、完整恢复模式和大容量日志恢)
- 手机QQ与小米路由器在一起 明天揭晓,敬请期待(手机QQ与小米路由器在一起)
- 小米音乐与 QQ 音乐合作,便捷迁移会员(小米音乐与QQ音乐合作)
- 小米推出米兔儿童电话手表奥特曼版,799 元,支持微信 QQ(小米推出米兔儿童电话手表奥特曼版)
- 贾怀胤唱《白龙马》 炸场 了 没想到京剧还能这么玩(贾怀胤唱白龙马)
- 白龙马的改编学生版,快来看看(白龙马的改编学生版)
- 萌娃唱《白龙马》走红,那生动的小表情,网友直呼 简直是戏精(萌娃唱白龙马走红)
热门推荐
- 前端技术图解(前端水印的简单实现代码示例)
- python如何编写判断正负数程序(Python实现判断一个整数是否为回文数算法示例)
- python怎么用代码写出心形(六行python代码的爱心曲线详解)
- dedecms标签调用详解(Dedecms待审核文章在列表页显示的方法)
- phpstudy修改为什么进不去(phpstudy2018升级后站点及phpmyadmin打开404解决方案)
- css中设置flex布局浮动是否会生效(深入理解CSS系列之flex兼容)
- nginx 一个域名对应多个项目(nginx前后端同域名配置的方法实现)
- sql server2008脚本执行(在Sql Server中调用外部EXE执行程序引发的问题)
- docker测试环境搭建(docker环境搭建JMeter+Grafana+influxdb可视化性能监控平台的教程)
- docker架构设计详解(Docker核心原理之 Cgroup详解)
排行榜
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9