--处理表重复记录(查询和删除)
/******************************************************************************************************************************************************
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. 科研论文提交流程与常见问题(EDAS 系统提交)

    第一步 注册文章(Registering your Paper) 如上图,点击菜单中的submit paper按钮,会列出所有的会议和期刊,选择一个你要投稿的期刊或者会议,例如选择第一个2013 IE ...

  2. 数学概念——F 概率(经典问题)birthday paradox

    F - 概率(经典问题) Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu Submit S ...

  3. Android开发必知--自定义Toast提示

    开发过Android的童鞋都会遇到一个问题,就是在打印Toast提示时,如果短时间内触发多个提示,就会造成Toast不停的重复出现,直到被触发的Toast全部显示完为止.这虽然不是什么大毛病,但在用户 ...

  4. C++程序原码

    直接插入排序基本算法 #include<iostream.h> #include<stdlib.h> #include<time.h> const int n=10 ...

  5. hdu-1272 并查集

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  6. SRM 402(1-250pt, 1-500pt)

    DIV1 250pt 题意:对于任意一个由1-n组成的数列,其原始顺序为1,2,3..n.给出1~n的一个排列a[n],要通过swp操作将其变回原始顺序.当i < j且a[i] > a[j ...

  7. Wireless Password - HDU 2825(ac自动机+状态压缩)

    题目大意:有个人想破解他邻居的密码,他邻居告诉了一些关于这个密码的信息,并且给他一个单词集合,他用这些信息判断一下最少有多少种密码. 1->, 所有的密码都是有小写字母组成. 2->,密码 ...

  8. C语言学习_从VC++6.0开始

    前言: C语言是一门博大精深的语言,C语言往往是程序员以及所有软件行业从业者的第一门编程语言. 编程环境: 对于初学者来说,我一开始学习C语言,其实是用的turboc 2.0版本,这个很有历史感,但是 ...

  9. App列表之分组ListView

    吸引用户的眼球,是我们至死不渝的追求:      第一时间呈现最有价值的信息,简明大方,告诉客户,你的选择是多么的明智,这正是你寻觅已久的东西. 分组的应用场合还是很多的,有数据集合的地方往往要分组显 ...

  10. 【转】Android开发中的SQLite事务处理,即beginTransaction()方法

    使用SQLiteDatabase的beginTransaction()方法可以开启一个事务,程序执行到endTransaction() 方法时会检查事务的标志是否为成功,如果程序执行到endTrans ...