删除部分重复的方法.doc_第1页
删除部分重复的方法.doc_第2页
删除部分重复的方法.doc_第3页
删除部分重复的方法.doc_第4页
删除部分重复的方法.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

-处理表重复记录(查询和删除)/*1、Num、Name相同的重复值记录,没有大小关系只保留一条2、Name相同,ID有大小关系时,保留大或小其中一个记录整理人:中国风(Roy)日期:2008.06.06*/-1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)- - (Roy)生成測試數據 if not object_id(Tempdb.#T) is null drop table #TGoCreate table #T(ID int,Name nvarchar(1),Memo nvarchar(2)Insert #Tselect 1,NA,NA1 union allselect 2,NA,NA2 union allselect 3,NA,NA3 union allselect 4,NB,NB1 union allselect 5,NB,NB2Go-I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2方法1:Select * from #T a where not exists(select 1 from #T where Name=a.Name and ID=b.ID group by a.ID,a.Name,a.Memo having count(1)=1 方法5:select * from #T a group by ID,Name,Memo having ID=(select min(ID)from #T where Name=a.Name)方法6:select * from #T a where (select count(1) from #T where Name=a.Name and IDall(select ID from #T where Name=a.Name)方法9(注:ID为唯一时可用):select * from #T a where ID in(select min(ID) from #T group by Name)-SQL2005:方法10:select ID,Name,Memo from (select *,min(ID)over(partition by Name) as MinID from #T a)T where ID=MinID方法11:select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID) as MinID from #T a)T where MinID=1生成结果:/*ID Name Memo- - -1 A A14 B B1(2 行受影响)*/-II、Name相同ID最大的记录,与min相反:方法1:Select * from #T a where not exists(select 1 from #T where Name=a.Name and IDa.ID)方法2:select a.* from #T a join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID order by ID方法3:select * from #T a where ID=(select max(ID) from #T where Name=a.Name) order by ID方法4:select a.* from #T a join #T b on a.Name=b.Name and a.IDa.ID)=0方法7:select * from #T a where ID=(select top 1 ID from #T where Name= order by ID desc)方法8:select * from #T a where ID! - (Roy)生成測試數據if not object_id(Tempdb.#T) is null drop table #TGoCreate table #T(ID int,Name nvarchar(1),Memo nvarchar(2)Insert #Tselect 1,NA,NA1 union allselect 2,NA,NA2 union allselect 3,NA,NA3 union allselect 4,NB,NB1 union allselect 5,NB,NB2Go-I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条方法1:delete a from #T a where exists(select 1 from #T where Name=a.Name and IDa.ID)方法2:delete a from #T a left join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null方法3:delete a from #T a where ID not in (select min(ID) from #T where Name=a.Name)方法4(注:ID为唯一时可用):delete a from #T a where ID not in(select min(ID)from #T group by Name)方法5:delete a from #T a where (select count(1) from #T where Name=a.Name and ID0方法6:delete a from #T a where ID(select top 1 ID from #T where Name= order by ID)方法7:delete a from #T a where IDany(select ID from #T where Name=a.Name)select * from #T生成结果:/*ID Name Memo- - -1 A A14 B B1(2 行受影响)*/-II、Name相同ID保留最大的一条记录:方法1:delete a from #T a where exists(select 1 from #T where Name=a.Name and IDa.ID)方法2:delete a from #T a left join (select max(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID where b.Id is null方法3:delete a from #T a where ID not in (select max(ID) from #T where Name=a.Name)方法4(注:ID为唯一时可用):delete a from #T a where ID not in(select max(ID)from #T group by Name)方法5:delete a from #T a where (select count(1) from #T where Name=a.Name and IDa.ID)0方法6:delete a from #T a where ID(select top 1 ID from #T where Name= order by ID desc)方法7:delete a from #T a where ID - (Roy)生成測試數據 if not object_id(Tempdb.#T) is null drop table #TGoCreate table #T(Num int,Name nvarchar(1)Insert #Tselect 1,NA union allselect 1,NA union allselect 1,NA union allselect 2,NB union allselect 2,NBGo方法1:if object_id(Tempdb.#) is not null drop table #Select distinct * into # from #T-排除重复记录结果集生成临时表#truncate table #T-清空表insert #T select * from # -把临时表#插入到表#T中-查看结果select * from #T/*Num Name- -1 A2 B(2 行受影响)*/-重新执行测试数据后用方法2方法2:alter table #T add ID int identity-新增标识列godelete a from #T a where exists(select 1 from #T where Num=a.Num and Name=a.Name and IDa.ID)-只保留一条记录goalter table #T drop column ID-删除标识列-查看结果select * from #T/*Num Name- -1 A2 B(2 行受影响)*/-重新执行测试数据后用方法3方法3:declare Roy_Cursor cursor local forselect count(1)-1,Num,Name from #T group by Num,Name having count(1)1declare con int,Num int,Name nvarchar(1)open Roy_Cursorfetch next from Roy_Cursor into con,Num,Namewhile Fetch_st

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论