sqlserver 删除重复记录处理(转)_实用技巧

注:此处“重复”非完全重复,意为某字段数据重复
  HZT表结构
ID int
Title nvarchar(50)
AddDate datetime
  数据
一. 查找重复记录
  1. 查找全部重复记录
Select * From 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)

2. 过滤重复记录(只显示一条)
Select * From HZT Where ID In (Select Max(ID) From HZT Group By Title)
注:此处显示ID最大一条记录
二. 删除重复记录
  1. 删除全部重复记录(慎用)
Delete 表 Where 重复字段 In (Select 重复字段 From 表 Group By 重复字段 Having Count(*)>1)

  2. 保留一条(这个应该是大多数人所需要的)
Delete HZT Where ID Not In (Select Max(ID) From HZT Group By Title)
  注:此处保留ID最大一条记录

其它相关:

删除重复记录有大小关系时,保留大或小其中一个记录

--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is nulldrop table #TGoCreate table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))Insert #Tselect 1,N'A',N'A1' union allselect 2,N'A',N'A2' union allselect 3,N'A',N'A3' union allselect 4,N'B',N'B1' union allselect 5,N'B',N'B2'Go

--I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条方法1:delete a from #T a where exists(select 1 from #T where Name=a.Name and ID<a.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 ID<a.ID)>0方法6:delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID)方法7:delete a from #T a where ID>any(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 ID>a.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.IDwhere 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 ID>a.ID)>0方法6:delete a from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID desc)方法7:delete a from #T a where ID<any(select ID from #T where Name=a.Name)select * from #T/*ID     Name Memo----------- ---- ----3      A  A35      B  B2

(2 行受影响)*/

--3、删除重复记录没有大小关系时,处理重复值--> --> (Roy)生成測試數據

if not object_id('Tempdb..#T') is nulldrop table #TGoCreate table #T([Num] int,[Name] nvarchar(1))Insert #Tselect 1,N'A' union allselect 1,N'A' union allselect 1,N'A' union allselect 2,N'B' union allselect 2,N'B'Go

方法1:if object_id('Tempdb..#') is not nulldrop 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 ID>a.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_status=0begin set rowcount @con;delete #T where Num=@Num and Name=@Nameset rowcount 0;fetch next from Roy_Cursor into @con,@Num,@Nameendclose Roy_Cursordeallocate Roy_Cursor

--查看结果select * from #T/*Num     Name----------- ----1      A2      B

(2 行受影响)*/

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索重复记录
sql server 重复记录、sql server去重复记录、sqlserver 重复记录、sql server查重复记录、sqlserver实用教程,以便于您获取更多的相关知识。

时间: 2024-09-20 03:19:01

sqlserver 删除重复记录处理(转)_实用技巧的相关文章

ASP.NET数组删除重复值实现代码_实用技巧

根据这段代码,自己编写了一个小程序作为代码资料参考,方便以后可以直接拿来用,不需要网上找.如果你觉得还不错的话,就把它收藏起来吧! 1.前台代码: <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>数组删除重复值</title> </head> <body> <form id="for

asp.net 防止用户通过后退按钮重复提交表单_实用技巧

防止用户通过后退按钮重复提交表单 <% response.Buffer=true response.Expires=0 response.ExpiresAbsolute=now()-1 response.CacheControl="no-cache" %> response.Buffer=true的意思就是指明输出页面是否被缓冲,当属性值为True时,服务器将不会向客户端发送任何信息,直到所有程序执行完或者遇到 <% Response.Flush %>或<

ASP.NET MVC5网站开发之用户资料的修改和删除3(七)_实用技巧

这次主要实现管理后台界面用户资料的修改和删除,修改用户资料和角色是经常用到的功能,但删除用户的情况比较少,为了功能的完整性还是坐上了.主要用到两个action "Modify"和"Delete". 一.用户资料修改(Modify) 此功能分两个部分: public ActionResult Modify(int id) 用于显示用户信息 [httppost] public ActionResult Modify(FormCollection form)用户就收前台传

ASP.NET对SQLServer的通用数据库访问类_实用技巧

本文模仿实现数据库访问的通用类,代码清晰,而且很实用,包括了对数据库的所有的常用的操作. /// <summary> /// 数据库访问通用类 /// </summary> public class SqlHelper { private string connectionString; /// <summary> /// 设定数据库访问字符串 /// </summary> public string ConnectionString { set { con

ASP.NET MVC5网站开发修改及删除文章(十)_实用技巧

上次做了显示文章列表,再实现修改和删除文章这部分内容就结束了,这次内容比较简单,由于做过了添加文章,修改文章非常类似,就是多了一个TryUpdateModel部分更新模型数据.一.删除文章 由于公共模型跟,文章,附件有关联,所以这里的删除次序很重要,如果先删除模型,那么文章ModelID和附件的ModelID多会变成null,所以要先先删除文章和附件再删除公共模型. 由于公共模型和附件是一对多的关系,我们把删除公共模型和删除附件写在一起. 在BLL的BaseRepository类中有默认的Del

.net jMail邮件发送(含抄送、密送、多发、日志记录)实例代码_实用技巧

jmail是一个第三方邮件操作组件,通常位于web服务器端,实现收邮件及发邮件功能(客户端用Foxmail这类就很好了).可以利用它轻松实现发邮件.抄送.密送.多发.日志记录及收邮件功能.本章要讲的,就是:发邮件.抄送.密送.多发.日志记录. 一.组件准备下载JMail44_pro并安装(记下安装路径) 找到安装路径,将其中的jmail.dll复制到项目中 二.核心发送代码新建MailAPI.cs,并输入以下代码 复制代码 代码如下: using System;using System.Coll

repeater做删除前弹窗询问实例_实用技巧

前台 复制代码 代码如下: <asp:LinkButton ID="delLinkButton" runat="server" OnClientClick='return confirm("确定删除?")'        CommandName="del" CommandArgument='<%# Eval("ID") %>'>删 除</asp:LinkButton> 后

GridView自定义删除操作的具体方法_实用技巧

首先,我们前端的代码如下: 复制代码 代码如下: <asp:GridView ID="gridViewDxjk" CssClass="gridview" runat="server" AllowPaging="True"                   DataKeyNames="P_ID" AutoGenerateColumns="False"                

GridView使用CommandField删除列实现删除时提示确认框_实用技巧

GridView在使用CommandField删除时弹出提示框,在.net2005提供的GridView中我们可以直接添加一个CommandField删除列:<asp:CommandField ShowDeleteButton="True" />,完后在它的RowDeleting事件中完成删除.但在多半我们在做这种删除操作时都需要先让操作者再确认下,完后再进行删除,以避免误操作引起的误删除. 可以通过下面方法给GridView删除前加上个确认对话框. 首先,在GridVie