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 但 ...
随机推荐
- 【枚举】Vijos P1012 清帝之惑之雍正
题目链接: https://vijos.org/p/1012 题目大意: 给n个坐标(n<=100 000),求直线距离最短是多少.数据较大用long long 或 double 题目思路: [ ...
- Unique Paths II ——LeetCode
Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...
- Search Insert Position——LeetCode
Given a sorted array and a target value, return the index if the target is found. If not, return the ...
- Linux下p2p的聊天功能实现
Linux下p2p的聊天功能实现细节 Do one thing at a time, and do well. 今天闲着没事,写一个P2P的点对点的聊天功能的小程序,我觉得对网络编程初学者的学习很有用 ...
- UIView和CALayer有什么关系
view是对layer的一种封装,你对view的很多操作事实上是对layer的操作,之所以会出现这两个东西是因为1.view支持很多手势的交互,你所操作iphone的各种点击,拖动等等.2.layer ...
- 将对象格式的style转换为字符串格式
var style = { position:'absolute', background:'red', width:'2px', height:'2px', color:'#fff', top:x, ...
- dos 命令
DOS远程桌面连接命令 mstsc /v: 192.168.1.250 /console cmd 运行 command删除文件 rd 文件名/S创建文件 MD 文件名 1. net user admi ...
- es6小技巧
let myKey = 'variableKey'; let obj = { key1: 'One', key2: 'Two', [myKey]: 'Three' /* 棒呆! */ }; 给变量键加 ...
- 《Linux命令行与shell脚本编程大全》 第二十七章 学习笔记
第二十七章:shell脚本编程进阶 监测系统统计数据 系统快照报告 1.运行时间 uptime命令会提供以下基本信息: 当前时间 系统运行的天数,小时数,分钟数 当前登录到系统的用户数 1分钟,5分钟 ...
- [C++] [算法] KMP算法
KMP串匹配算法是一个经典的算法. 传统BF算法是传统的字符串匹配算法.很好理解.叶实现.但时间复杂度太高. 本文将从字符串模式字符串被称为.为了匹配字符串被称为主弦. KMP配时能够少移动从串的位置 ...