delete from test where id in (select top Count(1)-1 id from test group by name having count(1)>1)
delete test from test t where id not in (select max(id) from test where name = t.name)
create table Test(id int,name varchar(20)) insert into test values(1 ,'aaa') insert into test values(2 ,'bbb') insert into test values(3 ,'aaa') insert into test values(4 ,'ccc') insert into test values(5 ,'bbb') godelete test from test t where id not in (select max(id) from test where name = t.name)select * from testdrop table test/* id name ----------- -------------------- 3 aaa 4 ccc 5 bbb(所影响的行数为 3 行) */
--2、删除重复记录有大小关系时,保留大或小其中一个记录 --> --> (Roy)生成測試數據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、删除重复记录没有大小关系时,处理重复值 --> --> (Roy)生成測試數據
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 行受影响) */
--id没重复 delete a from test a where exists(select 1 from test where a.name=name and a.id<id)select * from test --有重复 with cte as (select *,rn=ROW_NUMBER() over(PARTITION by name order by id desc) from test)delete from cte where rn>1
use temp go drop table #temp go create table #temp ( id int, name varchar(20) ) go insert into #temp values(1, 'aaa') insert into #temp values(2, 'bbb') insert into #temp values(3, 'aaa') insert into #temp values(4, 'ccc') insert into #temp values(5, 'bbb')select * from #temp godelete #temp from #temp b where id not in (select max(id) from #temp A where a.name = b.name) go select * from #temp go
where id in (select top Count(1)-1 id from test group by name having count(1)>1)
insert into test values(1 ,'aaa')
insert into test values(2 ,'bbb')
insert into test values(3 ,'aaa')
insert into test values(4 ,'ccc')
insert into test values(5 ,'bbb')
godelete test from test t where id not in (select max(id) from test where name = t.name)select * from testdrop table test/*
id name
----------- --------------------
3 aaa
4 ccc
5 bbb(所影响的行数为 3 行)
*/
--> --> (Roy)生成測試數據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、删除重复记录没有大小关系时,处理重复值
--> --> (Roy)生成測試數據
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 行受影响)
*/
delete a from test a
where exists(select 1 from test where a.name=name and a.id<id)select * from test
--有重复
with cte as
(select *,rn=ROW_NUMBER() over(PARTITION by name order by id desc) from test)delete from cte where rn>1
go
drop table #temp
go
create table #temp
(
id int,
name varchar(20)
)
go
insert into #temp values(1, 'aaa')
insert into #temp values(2, 'bbb')
insert into #temp values(3, 'aaa')
insert into #temp values(4, 'ccc')
insert into #temp values(5, 'bbb')select * from #temp
godelete #temp from #temp b
where id not in (select max(id) from #temp A where a.name = b.name)
go
select * from #temp
go