sql语句去除重复记录(多表连接的查询)
--处理表重复记录(查询和删除)
/******************************************************************************************************************************************************
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
1
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
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 A1
4 B B1
(2 行受影响)
*/
--II、Name相同ID最大的记录,与min相反:
方法1:
Select
*
from
#T a
where
not
exists(
select
1
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.
Name
)
order
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
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
desc
)
as
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
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 A1
4 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.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
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 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
a
from
#T a
where
exists(
select
1
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语句去除重复记录(多表连接的查询)的更多相关文章
- SQL语句查找重复记录
select * from AM_C4_ENTRY t where t.created_by in ( select t.created_by from AM_C4_ENTRY t group by ...
- SQL Server数据库--》top关键字,order by排序,distinct去除重复记录,sql聚合函数,模糊查询,通配符,空值处理。。。。
top关键字:写在select后面 字段的前面 比如你要显示查询的前5条记录,如下所示: select top 5 * from Student 一般情况下,top是和order by连用的 orde ...
- SQL查询语句去除重复行
1.存在两条完全相同的纪录 这是最简单的一种情况,用关键字distinct就可以去掉 select distinct * from table(表名) where (条件) 2.存在部分字段相同的纪录 ...
- SQL去除重复记录
SQL去除重复记录 if not object_id('Tempdb..#T') is null drop table #T Go Create table #T([ID] int,[Name ...
- SQL语句分组排序,多表关联排序
SQL语句分组排序,多表关联排序总结几种常见的方法: 案例一: 在查询结果中按人数降序排列,若人数相同,则按课程号升序排列? 分析:单个表内的多个字段排序,一般可以直接用逗号分割实现. select ...
- 【SQL】IN、EXISTS和表连接三者的效率比较
一. IN和EXISTS比较 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行查询.此时就会用到IN和EXISTS. 例如:查询departments表中存在的部门的人数. 1. 使 ...
- sql语句,怎么查看一个表中的所有约束
sql语句,怎么查看一个表中的所有约束,比如,一个student表,有唯一,外键,主键,用sql语句怎么查看student表中的所有约束呢? select * from sysobjects wher ...
- SQL语句获取数据库中的表主键,自增列,所有列
SQL语句获取数据库中的表主键,自增列,所有列 获取表主键 1:SELECT TABLE_NAME,COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_U ...
- 怎样用sql语句复制表table1到表table2的同时复制主键
原文:怎样用sql语句复制表table1到表table2的同时复制主键 在从table1表复制到table2的时候,我们会用语句: select * into table2 from table1 但 ...
随机推荐
- [Locked] Sparse Matrix Multiplication
Given two sparse matrices A and B, return the result of AB. You may assume that A's column number is ...
- TCP 的那些事儿(下)
这篇文章是下篇,所以如果你对TCP不熟悉的话,还请你先看看上篇<TCP的那些事儿(上)> 上篇中,我们介绍了TCP的协议头.状态机.数据重传中的东西.但是TCP要解决一个很大的事,那就是要 ...
- Java 二分查找
public int binarySearch(int[] nums, int target) { int low = 0; int high = nums.length; while (low &l ...
- DateGridew导出Excel表+常见错误提示
在敲机房收费系统的时候,显示数据的时候需要将DateGridew 中的数据导出进Excel表.DateGridew导出Excel表是比较常见的,当然导出Excel表有很多种方法,下面是个人认为比较容易 ...
- Linux 调度器模拟
http://www.ibm.com/developerworks/cn/linux/l-linux-scheduler-simulator/ LinSched LinSched 是驻留在用户空间中的 ...
- Meth | elementary OS常用配置
一,搜狗输入法 sudo apt-get remove ibussudo add-apt-repository ppa:fcitx-team/nightlysudo apt-get updatesud ...
- 使用HTML5 WebDataBase设计离线数据库
基于HTML5的Web DataBase 可以让你在浏览器中进行数据持久地存储管理和有效查询,假设你的离线应用程序有需要规范化的存储功能,那么使用Web DataBase,可以使你的应用程序无论是在离 ...
- 模板-->常系数线性齐次递推(矩阵快速幂)
如果有相应的OJ题目,欢迎同学们提供相应的链接 相关链接 所有模板的快速链接 Matrix模板 poj_2118_Firepersons,my_ac_code 简单的测试 None 代码模板 /* * ...
- POJ 1039 Pipe 枚举线段相交
Pipe Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 9493 Accepted: 2877 Description ...
- Chain of Responsibility 责任链模式
简介 责任链模式是一种对象的行为模式.在责任链模式里,很多对象由每一个对象对其[下家]的引用而连接起来形成一条链,请求在这个链上[传递],直到链上的某一个对象决定处理此请求.发出这个请求的客户端并不知 ...