当前位置: 首页 > news >正文

【原创】用SQL语句删除重复记录的方法总结

问题:如何把具有相同字段的记录删除,只留下一条。
例如:表test里有id,name字段,如果有name相同的记录只留下一条,其余的删除。name的内容不定,相同的记录数不定。
本人原创方法:


delete from users a
  left join (select id = max(id), usercd from users where usercd in (select usercd from users group by usercd having count(usercd)>1) group by usercd) b
    on a.usercd = b.usercd
where a.id <> b.id
  and isnull(b.usercd, '') <> ''

以下来自网络:
方法1:
 
1、将重复的记录记入temp1表
 

select [标志字段id],count(*) into temp1 from [表名]
group by [标志字段id]
having count(*)>1


2、将不重复的记录记入temp1表
 

insert temp1
select [标志字段id],count(*) from [表名]
group by [标志字段id]
having count(*)=1

 
3、作一个包含所有不重复记录的表
 

select * into temp2 from [表名]
where 标志字段id in(select 标志字段id from temp1)

 
4、删除重复表:delete [表名]
 
5、恢复表

insert [表名]
select * from temp2


6、删除临时表

drop table temp1
drop table temp2

 
方法2:

declare @max integer,@id integer
declare cur_rows cursor local for
select id,count(*) from 表名 group by id having count(*) > 1
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
delete from 表名 where id = @id
fetch cur_rows into @id,@max
end
close cur_rows
set rowcount 0


注:set rowcount @max - 1表示当前缓冲区只容纳@max-1条记录,如果有十条重复的,就刪除10条,一定会留一条的。也可以写成delete from 表名。
方法3:

create table a_dist(id int,name varchar(20))


insert into a_dist values(1,'abc')
insert into a_dist values(1,'abc')
insert into a_dist values(1,'abc')
insert into a_dist values(1,'abc')

exec up_distinct 'a_dist','id'

select * from a_dist

create procedure up_distinct(@t_name varchar(30)
,@f_key varchar(30))
--f_key表示是分组字段﹐即主键字段
as
begin
declare @max integer,@id varchar(30) ,
@sql varchar(7999) ,@type integer
select @sql = 'declare cur_rows cursor
for select '+@f_key+' ,count(*) from '
+@t_name +' group by ' +@f_key +' having count(*) > 1'
exec(@sql)
open cur_rows
fetch cur_rows into @id,@max
while @@fetch_status=0
begin
select @max = @max -1
set rowcount @max
select @type = xtype from syscolumns
where id=object_id(@t_name) and name=@f_key
if @type=56
select @sql = 'delete from '+@t_name+'
where ' + @f_key+' = '+ @id
if @type=167
select @sql = 'delete from '+@t_name+'
where ' + @f_key+' = '+''''+ @id +''''
exec(@sql)
fetch cur_rows into @id,@max
end
close cur_rows
deallocate cur_rows
set rowcount 0
end

select * from systypes
select * from syscolumns where
id = object_id('a_dist')
方法4:

可以用IGNORE_DUP_KEY:


create table dup (id int identity not null,
name varchar(50)not null)
go
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('abc')
insert into dup(name) values ('cdefg')
insert into dup(name) values ('xyz')
insert into dup(name) values ('xyz')
go
select *
from dup
go
create table tempdb..wk(id int not null,
name varchar(50)not null)
go
create unique index idx_remove_dup
on tempdb..wk(name)
with IGNORE_DUP_KEY
go
INSERT INTO tempdb..wk (id, name)
select id, name
from dup
go
select *
from tempdb..wk
go
delete from dup
go
set identity_insert dup on
INSERT INTO dup (id, name)
select id, name
from tempdb..wk
go
set identity_insert dup off
go
select *
from dup
go
方法5:
select distinct * into #Tmp from tableName drop table tableName select * into tableName from #Tmp drop table #Tmp

转载于:https://www.cnblogs.com/cosiray/archive/2009/09/22/1571771.html

相关文章:

  • 软件定义的4-7层服务
  • 实现一个JavaScript验证的Asp.net Helper
  • HTML重构与网页常用工具
  • 国学应用大师翟鸿燊经典语录
  • shell---scp远程传输文件不需要手动输入密码
  • STP生成树协议
  • WDatePicker
  • OSPF笔记-2
  • 使用goldengate交付指定时间前的数据
  • 采购杀毒软件,你说话能算数么?
  • OpenStack 部署运维实战
  • 我的项目管理之路
  • jQuery - AJAX load() 方法
  • editplus与正则替换
  • Android PopupWindow 的使用
  • ES6指北【2】—— 箭头函数
  • -------------------- 第二讲-------- 第一节------在此给出链表的基本操作
  • 时间复杂度分析经典问题——最大子序列和
  • [微信小程序] 使用ES6特性Class后出现编译异常
  • “大数据应用场景”之隔壁老王(连载四)
  • 【159天】尚学堂高琪Java300集视频精华笔记(128)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 07.Android之多媒体问题
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • Android开源项目规范总结
  • css布局,左右固定中间自适应实现
  • DataBase in Android
  • django开发-定时任务的使用
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python中eval与exec的使用及区别
  • springMvc学习笔记(2)
  • swift基础之_对象 实例方法 对象方法。
  • tweak 支持第三方库
  • 编写高质量JavaScript代码之并发
  • 关于Java中分层中遇到的一些问题
  • 如何在GitHub上创建个人博客
  • 限制Java线程池运行线程以及等待线程数量的策略
  • 用mpvue开发微信小程序
  • ​如何在iOS手机上查看应用日志
  • #1015 : KMP算法
  • #14vue3生成表单并跳转到外部地址的方式
  • (Git) gitignore基础使用
  • (vue)页面文件上传获取:action地址
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (备忘)Java Map 遍历
  • (第27天)Oracle 数据泵转换分区表
  • (第9篇)大数据的的超级应用——数据挖掘-推荐系统
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (转)为C# Windows服务添加安装程序
  • .gitignore文件—git忽略文件
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core中的去虚