--处理表重复记录(查询和删除)
/******************************************************************************************************************************************************
1、Num、Name相同的重复值记录,没有大小关系只保留一条
2、Name相同,ID有大小关系时,保留大或小其中一个记录

******************************************************************************************************************************************************/
 
--1、用于查询重复处理记录(如果列没有大小关系时2000用生成自增列和临时表处理,SQL2005用row_number函数处理)
 
--> --> 生成測試數據
  
if not object_id('Tempdb..#T'is null
    drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
Go
 
 
--I、Name相同ID最小的记录(推荐用1,2,3),方法3在SQl05时,效率高于1、2
方法1:
Select from #T a where not exists(select from #T where Name=a.Name and ID<a.ID)
 
方法2:
select a.* from #T a join (select min(ID)ID,Name from #T group by Name) b on a.Name=b.Name and a.ID=b.ID
 
方法3:
select from #T a where ID=(select min(ID) from #T where Name=a.Name)
 
方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.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 ID<a.ID)=0
 
方法7:
select from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID)
 
方法8:
select from #T a where ID!>all(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 Nameas 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    A1
4           B    B1
 
(2 行受影响)
*/
 
 
--II、Name相同ID最大的记录,与min相反:
方法1:
Select from #T a where not exists(select from #T where Name=a.Name and ID>a.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.Nameorder by ID
 
方法4:
select a.* from #T a join #T b on a.Name=b.Name and a.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 max(ID)from #T where Name=a.Name)
 
方法6:
select from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)=0
 
方法7:
select from #T a where ID=(select top 1 ID from #T where Name=a.name order by ID desc)
 
方法8:
select from #T a where ID!<all(select ID from #T where Name=a.Name)
 
方法9(注:ID为唯一时可用):
select from #T a where ID in(select max(ID) from #T group by Name)
 
--SQL2005:
 
方法10:
select ID,Name,Memo from (select *,max(ID)over(partition by Nameas MinID from #T a)T where ID=MinID
 
方法11:
select ID,Name,Memo from (select *,row_number()over(partition by Name order by ID descas MinID from #T a)T where MinID=1
 
生成结果2:
/*
ID          Name Memo
----------- ---- ----
3           A    A3
5           B    B2
 
(2 行受影响)
*/
 
 
 
--2、删除重复记录有大小关系时,保留大或小其中一个记录
 
 
--> --> 生成測試數據
 
if not object_id('Tempdb..#T'is null
    drop table #T
Go
Create table #T([ID] int,[Name] nvarchar(1),[Memo] nvarchar(2))
Insert #T
select 1,N'A',N'A1' union all
select 2,N'A',N'A2' union all
select 3,N'A',N'A3' union all
select 4,N'B',N'B1' union all
select 5,N'B',N'B2'
Go
 
--I、Name相同ID最小的记录(推荐用1,2,3),保留最小一条
方法1:
delete from #T a where  exists(select 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 from #T a where ID not in (select min(ID) from #T where Name=a.Name)
 
方法4(注:ID为唯一时可用):
delete from #T a where ID not in(select min(ID)from #T group by Name)
 
方法5:
delete from #T a where (select count(1) from #T where Name=a.Name and ID<a.ID)>0
 
方法6:
delete from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID)
 
方法7:
delete from #T a where ID>any(select ID from #T where Name=a.Name)
 
 
 
select from #T
 
生成结果:
/*
ID          Name Memo
----------- ---- ----
1           A    A1
4           B    B1
 
(2 行受影响)
*/
 
 
--II、Name相同ID保留最大的一条记录:
 
方法1:
delete from #T a where  exists(select 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.ID where b.Id is null
 
方法3:
delete from #T a where ID not in (select max(ID) from #T where Name=a.Name)
 
方法4(注:ID为唯一时可用):
delete from #T a where ID not in(select max(ID)from #T group by Name)
 
方法5:
delete from #T a where (select count(1) from #T where Name=a.Name and ID>a.ID)>0
 
方法6:
delete from #T a where ID<>(select top 1 ID from #T where Name=a.name order by ID desc)
 
方法7:
delete from #T a where ID<any(select ID from #T where Name=a.Name)
 
 
select from #T
/*
ID          Name Memo
----------- ---- ----
3           A    A3
5           B    B2
 
(2 行受影响)
*/
 
 
 
 
 
--3、删除重复记录没有大小关系时,处理重复值
 
 
--> --> 生成測試數據
  
if not object_id('Tempdb..#T'is null
    drop table #T
Go
Create table #T([Num] int,[Name] nvarchar(1))
Insert #T
select 1,N'A' union all
select 1,N'A' union all
select 1,N'A' union all
select 2,N'B' union all
select 2,N'B'
Go
 
方法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           A
2           B
 
(2 行受影响)
*/
 
--重新执行测试数据后用方法2
方法2:
 
alter table #T add ID int identity--新增标识列
go
delete from  #T a where  exists(select from #T where Num=a.Num and Name=a.Name and ID>a.ID)--只保留一条记录
go
alter table #T drop column ID--删除标识列
 
--查看结果
select from #T
 
/*
Num         Name
----------- ----
1           A
2           B
 
(2 行受影响)
 
*/
 
--重新执行测试数据后用方法3
方法3:
declare Roy_Cursor cursor local for
select count(1)-1,Num,Name from #T group by Num,Name having count(1)>1
declare @con int,@Num int,@Name nvarchar(1)
open Roy_Cursor
fetch next from Roy_Cursor into @con,@Num,@Name
while @@Fetch_status=0
begin 
    set rowcount @con;
    delete #T where Num=@Num and Name=@Name
    set rowcount 0;
    fetch next from Roy_Cursor into @con,@Num,@Name
end
close Roy_Cursor
deallocate Roy_Cursor
 
--查看结果
select from #T
/*
Num         Name
----------- ----
1           A
2           B
 
(2 行受影响)
*/

sql语句去除重复记录(多表连接的查询)的更多相关文章

  1. SQL语句查找重复记录

    select * from AM_C4_ENTRY t where t.created_by in ( select t.created_by from AM_C4_ENTRY t group by ...

  2. SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。

    top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...

  3. SQL查询语句去除重复行

    1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 select distinct * from table(表名) where (条件) 2.存在部分字段相同的纪录 ...

  4. SQL去除重复记录

    SQL去除重复记录 if not object_id('Tempdb..#T') is null     drop table #T Go Create table #T([ID] int,[Name ...

  5. SQL语句分组排序,多表关联排序

    SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...

  6. 【SQL】IN、EXISTS和表连接三者的效率比较

    一. IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询.此时就会用到IN和EXISTS. 例如:查询departments表中存在的部门的人数. 1. 使 ...

  7. sql语句,怎么查看一个表中的所有约束

    sql语句,怎么查看一个表中的所有约束,比如,一个student表,有唯一,外键,主键,用sql语句怎么查看student表中的所有约束呢? select * from sysobjects wher ...

  8. SQL语句获取数据库中的表主键,自增列,所有列

    SQL语句获取数据库中的表主键,自增列,所有列   获取表主键 1:SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_U ...

  9. 怎样用sql语句复制表table1到表table2的同时复制主键

    原文:怎样用sql语句复制表table1到表table2的同时复制主键 在从table1表复制到table2的时候,我们会用语句: select * into table2 from table1 但 ...

随机推荐

  1. osg配置

    编辑器加载中..OSG+VS2010+win7环境搭建 Win7下 osg+vs2010环境搭建 一.相关准备 a) Osg源码 当前最新版:OpenSceneGraph的3.0.0.zip 下载链接 ...

  2. 动态规划——K背包问题

    Problem DescriptionNow you are asked to measure a dose of medicine with a balance and a number of we ...

  3. [已解决问题] An error occurred while automatically activating bundle com.android.ide.eclipse.adt

    可以参见stackoverflow的解决方案:http://stackoverflow.com/questions/16974349/an-error-occurred-while-automatic ...

  4. [Git] MAC上Git初探

    1.基本设置,包括用户名.邮箱.编辑工具.查看设置.帮助等 $ git config --global user.name "John Doe" $ git config --gl ...

  5. Wireshark 基本介绍和学习 TCP 三次握手

    这篇文章介绍另一个好用的抓包工具 Wireshark, 用来获取网络数据封包,包括 HTTP.TCP.UDP 等网络协议包. 记得大学的时候就学习过TCP的三次握手协议,那时候只是知道,虽然在书上看过 ...

  6. sql server 常用小知识点

    1. sql server的语法:中文要加 N select * from eVA_EMPBoard where name = N'施纪平' 而oracle的不用 2.

  7. ASP.NET中生成rss.xml

    本文转载:http://www.afuhao.com/article_articleId-177.shtml RSS格式的xml文件的格式,可以考虑用nvelocity模板引擎. 北风网rss视频:h ...

  8. POJ 1985 Cow Marathon && POJ 1849 Two(树的直径)

    树的直径:树上的最长简单路径. 求解的方法是bfs或者dfs.先找任意一点,bfs或者dfs找出离他最远的那个点,那么这个点一定是该树直径的一个端点,记录下该端点,继续bfs或者dfs出来离他最远的一 ...

  9. ButterKnife 注解

    简介 官网:http://jakewharton.github.io/butterknife/ github:https://github.com/JakeWharton/butterknife 依赖 ...

  10. net 关于系统性能调优了解和看法

    系统性能调优这是每个大中型项目的必要手段,当系统运行积累到一定量的时候 这个时候就需要一个质变的过程那这个时候就少不了优化和调整 (前几天看了一篇文章 感觉写的挺好,也挺实在的  链接:http:// ...