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 但 ...
随机推荐
- IIS 启用或关闭目录浏览
如果不希望启用目录浏览,请确保配置了默认文档并且该文件存在. 使用 IIS 管理器启用目录浏览. 打开 IIS 管理器. 在“功能”视图中,双击“目录浏览”. 在“目录浏览”页上,在“操作”窗格中单击 ...
- 从JavaScript的移位运算看数字在计算机内部的编码——补码
偶然看到一个JavaScript的题目: js中13>>2=? -13>>2=? 在浏览器中很容易测试出答案分别是 3 和 -4. 13>>2 = 3 很 ...
- zoj 2706 线段树
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1706 trick:关于正数和负数的整除问题,正数整除是自动向下取整的 ...
- 理解Java NIO
基础概念• 缓冲区操作缓冲区及操作是所有I/O的基础,进程执行I/O操作,归结起来就是向操作系统发出请求,让它要么把缓冲区里的数据排干(写),要么把缓冲区填满(读).如下图• 内核空间.用户空间 上图 ...
- 分页过滤SQL求总条数SQL正则
public static void main(String[] args) throws Exception { String queryForScanUsers_SQL = "selec ...
- 什么是:VGA SVGA XGA SXGA
经常可以看到VGA这些专业术语,通常这些重要技术指标指的是液晶屏(TFT LCD)的分辨率. TFT是英文Thin Film Transistor的缩写,中文意思是薄膜晶体管. VGA(Video G ...
- 设置IIS7文件上传的最大大小 maxAllowedContentLength,maxRequestLength
当上传一个超过30M的文件时,服务器会重定向至404.13页面,报错如下: HTTP Error 404.13 - Not Found The request filtering module is ...
- ubuntu sublime安装及配置
安装sublime-text-2: sudo add-apt-repository ppa:webupd8team/sublime-text-2 sudo apt-get update sudo ap ...
- boost库在工作(15)绑定器与函数对象之三
前面已经可以优美地解决两个参数的函数给算法for_each调用了,但是又会遇到这样的一种情况,当需要三个参数或者三个以上的参数给算法for_each调用呢?从STL里的绑定器bind1st,显然是不行 ...
- [转] 条件变量(Condition Variable)详解
http://www.wuzesheng.com/?p=1668 条件变量(Condtion Variable)是在多线程程序中用来实现“等待->唤醒”逻辑常用的方法.举个简单的例子,应用程序A ...