sql删除重复数据的详细方法_MsSql

来源:脚本之家  责任编辑:小易  

案例:id 姓名 课程名称 分数1 张三 数学 692 李四 数学 893 张三 数学 69删除除了自动编号不同,其他都相同的学生冗余信息按常理来说,这个sql语句应该是:delete tablename where id not in(select min(id)from tablename group by name,kecheng,fenshu);这种写法在sqlserver或者oracle中是支持的,但是mysql目前是不支持的,会报类似错:You can't specify target table 'tablename' for update,这是因为在mysql中不能同时查询一个表的数据再同时进行删除.目前网上流行的一种解法是:1)创建一个临时表,讲要查询的列的存入临时表中create table temp as select.2)在temp表和原始表中进行操作delete from tablename3)drop temp.但是这种做法,不仅浪费空间资源,同时也缺乏友好性。通过观察我们发现这类查询要解决的是如何将子查询中的表与主查询中的表区分开来,因此我们可以考虑用别名的方法,将子查询的结果放到一个别名中。完整的sql语句如下:DELETE FROM tablename where id not in(select bid from(select min(id)as bid from tablename group by name,kecheng,fenshu)as b);解释:select bid from(select min(id)as bid from tablename group by name,kecheng,fenshu)as b这个子查询的目的是从b中列出讲筛选结果,即bid的集合。(select min(id)as bid from tablename group by name,kecheng,fenshu)as b将分组结果中的最小的bid当做一个心的集合当做一个心的子表b,注意mid(id)一定要有一个别名,这里取的是bid,作为b的一个列名,因为在上一级查询中要用到这个列名www.zgxue.com防采集请勿采集本网。

一. 删除完全重复的记录

你要首先把你的逻辑描述完整才能给你最终的答案。你看,比如有3个数据: A B C 1 1 3 15 1 3 83 1 3 1.按照你说的,你希望B C 数据相同的只保留1个,那么以上3条数据 你要删除哪2个?保留那个?2

完全重复的数据,通常是由于没有设置主键/唯一键约束导致的。

图片很模糊看不清,你看看下面方法可以吗 去除表A的重复值user MyDB-进入需要修改的数据库中 select distinct*into#tmp from[A]-先将数据存入一张临时表中,剔除重复项 truncate table[A]-然后

测试数据:

复制代码 代码如下:

我的测试过程: 先创建一个测试表: create table test(column1 int,column2 int);然后插入数据: insert into test 能不能给下,你的表结构和你的删除sql的语句,我试了删除重复的数据,都没有问题。

if OBJECT_ID('duplicate_all') is not null

delete table where id-标识列-not in(select min(id)from table group by Jnum,Wnum)

drop table duplicate_all

没太明白你的意思 是删除列么 删除列语句:Alter table tablename Drop column Columnname 根据字符判断,如果首字符都是英文的话 delete from table where ascii(left('名称',1)) 测试了 这个对

GO

create table duplicate_all

(

c1 int,

c2 int,

c3 varchar(100)

)

GO

insert into duplicate_all

select 1,100,'aaa' union all

select 1,100,'aaa' union all

select 1,100,'aaa' union all

select 1,100,'aaa' union all

select 1,100,'aaa' union all

select 2,200,'bbb' union all

select 3,300,'ccc' union all

select 4,400,'ddd' union all

select 5,500,'eee'

GO

(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

如果多个表有完全重复的行,可以考虑通过UNION将多个表联合,插到一个新的同结构的表,SQL Server会帮助去掉表和表之间的重复行。

二. 删除部分重复的记录

部分列重复的数据,通常表上是有主键的,可能是程序逻辑造成了多行数据列值的重复。

测试数据:

复制代码 代码如下:

if OBJECT_ID('duplicate_col') is not null

drop table duplicate_col

GO

create table duplicate_col

(

c1 int primary key,

c2 int,

c3 varchar(100)

)

GO

insert into duplicate_col

select 1,100,'aaa' union all

select 2,100,'aaa' union all

select 3,100,'aaa' union all

select 4,100,'aaa' union all

select 5,500,'eee'

GO

(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)

如果要保留重复记录中的第N行,可以参考05.取分组中的某几行。

(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删除重复数据只保留一条 (下面的代码,很多网友反馈错误,大家多测试)

用SQL语句,删除掉重复项只保留一条

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢

1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断

select * from people

where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录

delete from people

where   peopleName in (select peopleName    from people group by peopleName      having count(peopleName) > 1)

and   peopleId not in (select min(peopleId) from people group by peopleName     having count(peopleName)>1)

3、查找表中多余的重复记录(多个字段)

select * from vitae a

where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录

delete from vitae a

where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录

select * from vitae a

where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)

and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)  

6.消除一个字段的左边的第一位:

update tableName set [Title]=Right([Title],(len([Title])-1)) where Title like '村%'

7.消除一个字段的右边的第一位:

update tableName set [Title]=left([Title],(len([Title])-1)) where Title like '%村'

8.假删除表中多余的重复记录(多个字段),不包含rowid最小的记录

update vitae set ispass=-1

where peopleId in (select peopleId from vitae group by peopleId

SQL Server删除重复行是我们最常见的操作之一,下面就为您介绍六种适合不同情况的SQL Server删除重复行的方法,供您参考。1.如果有ID字段,就是具有唯一性的字段delect table where id not inselect max(id)from table group by col1,col2,col3.group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。2.如果是判断所有字段也可以这样select*into#aa from table group by id1,id2,.delete tableinsert into tableselect*from#aa3.没有ID的情况select identity(int,1,1)as id,*into#temp from tabeldelect#where id not inselect max(id)from#group by col1,col2,col3.)delect tableinset into table(.)select.from#temp4.col1+','+col2+','.col5 联合主键select*from table where col1+','+col2+','.col5 inselect max(col1+','+col2+','.col5)from tablewhere having count(*)>1group by col1,col2,col3,col4group by 子句后跟的字段就是你用来判断重复的条件,如只有col1,那么只要col1字段内容相同即表示记录相同。5.select identity(int,1,1)as id,*into#temp from tabelselect*from#temp where id inselect max(id)from#emp where having count(*)>1 group by col1,col2,col3.)6.select distinct*into#temp from tablenamedelete tablenamegoinsert tablename select*from#temp Sqlclubgodrop table#temp以上就是SQL Server删除重复行的方法介绍内容来自www.zgxue.com请勿采集。


  • 本文相关:
  • 删除mysql数据库中的重复数据记录
  • 教你几种在sqlserver中删除重复数据方法
  • sqlserver中重复数据值只取一条的sql语句
  • 分享mysql插入数据时忽略重复数据的方法
  • mysql删除重复数据的简单方法
  • mysql 删除数据库中重复数据方法小结
  • 删除mysql重复数据的方法
  • mysql中删除重复数据的简单方法
  • mysql处理重复数据的方法
  • 很全面的mysql处理重复数据代码
  • sql学习第三天——sql 关于with ties介绍
  • 除mssql数据库text字段中恶意脚本的删方法
  • 利用sql语句给字段加注释的方法
  • sql中时间以5分钟半个小时任意间隔分组的实现方法
  • row_number sql server 2005的limit功能实现(row_number()排序函
  • sql 查询性能优化 解决书签查找
  • sqlserver 无法验证产品密匙的完美解决方案[测试通过]
  • 一次性压缩sqlserver2005中所有库日志的存储过程
  • sql server存储过程同时返回分页结果集和总数
  • sqlserver 数据导入导出的几种方法小结
  • sql中删除重复数据
  • sql删除重复数据只保留一条
  • SQL中如何删除重复数据
  • SQL删除重复数据语句怎么写
  • sql 删除重复的数据
  • sql中删除重复数据
  • sql数据如何删除重复的数据?直接删除老是报如下图错误、
  • SQL删除重复数据保留一条
  • SQL表中删除重复数据怎么弄?
  • sql 如何删除重复的数据
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页mssql删除mysql数据库中的重复数据记录教你几种在sqlserver中删除重复数据方法sqlserver中重复数据值只取一条的sql语句分享mysql插入数据时忽略重复数据的方法mysql删除重复数据的简单方法mysql 删除数据库中重复数据方法小结删除mysql重复数据的方法mysql中删除重复数据的简单方法mysql处理重复数据的方法很全面的mysql处理重复数据代码sql学习第三天——sql 关于with ties介绍除mssql数据库text字段中恶意脚本的删方法利用sql语句给字段加注释的方法sql中时间以5分钟半个小时任意间隔分组的实现方法row_number sql server 2005的limit功能实现(row_number()排序函sql 查询性能优化 解决书签查找sqlserver 无法验证产品密匙的完美解决方案[测试通过]一次性压缩sqlserver2005中所有库日志的存储过程sql server存储过程同时返回分页结果集和总数sqlserver 数据导入导出的几种方法小结sql server 2012 安装图解教程(附sql server数据库入门学习总结microsoft sql server 2012 数据sql重复记录查询的几种方法win7系统安装sqlserver2000的详细sqlserver中distinct的用法(不重sql server错误代码大全及解释(sql-order by 多字段排序(升序、sql将一个表中的数据插入到另一个用sql语句添加删除修改字段、一些五种sql server分页存储过程的方法及性能sql server 2012完全卸载方法 只需8步轻松探讨select in 在postgresql的效率问题解析sql server聚焦移除(bookmark looku数据库存储过程分页显示sql server数据库的修复sql语句参考sql2012存储过程写的统计所有用户表尺关于sql和mysql对于别名不能调用的一些理sqlserver 不能将值null插入列id(列不允许sql判断语句用法和多表查询
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved