删除某字段重复的记录,保留主键值最小的,只剩一条。
比如:
ID login_name
-----------
1 aa
2 aa (删除)
3 bb
4 cc
5 cc (删除)不重复的就不要删除了。
结果应该是:ID login_name
-----------
1 aa
3 bb
4 cc多谢!有了答案就结帐
比如:
ID login_name
-----------
1 aa
2 aa (删除)
3 bb
4 cc
5 cc (删除)不重复的就不要删除了。
结果应该是:ID login_name
-----------
1 aa
3 bb
4 cc多谢!有了答案就结帐
where exists(select 1 from tb t where t.login_name=tb.login_name and t.id<tb.id)
if object_id('[tb]') is not null drop table [tb]
go
create table [tb]([ID] int,[login_name] varchar(2))
insert [tb]
select 1,'aa' union all
select 2,'aa' union all
select 3,'bb' union all
select 4,'cc' union all
select 5,'cc'
---删除---
delete tb
where exists(select 1 from tb t where t.login_name=tb.login_name and t.id<tb.id)---查询---
select * from [tb]---结果---
ID login_name
----------- ----------
1 aa
3 bb
4 cc(所影响的行数为 3 行)
tb
where
exists(select 1 from tb t where t.login_name=tb.login_name and t.id<tb.id)
--> --> (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 行受影响)
*/