sql server删除表中重复记录

发布时间:2020-05-12编辑:脚本学堂
本文介绍了sql server中删除表中重复记录的方法,有需要的朋友参考下。

如何按字段删除重复记录?
一张表里面以两个字段为唯一字段,当几条记录的这两个字段完全相同时,需要删除重复项。

例如下表:
 

复制代码 代码示例:
a b c d
1 2 3 4
1 5 3 5
1 2 7 9
 

以a、b为唯一字段,第一条和第三条的a、b完全相同,所以,需要删除第一条记录1 2 3 4 或者第三条记录1 2 7 9
即如下结果:
a b c d
1 2 3 4
1 5 3 5

a b c d
1 5 3 5
1 2 7 9
请问各位大侠这种sql语句怎么写?
 

复制代码 代码示例:
CREATE TABLE Tb1(id int, [a] varchar(255), [b] varchar(255), [c] varchar(255), [d] varchar(255))
INSERT Tb1(id, [a], [b], [c], [d])
           SELECT 1, '1','2','3','4'
UNION ALL  SELECT 2, '1','5','3','5'
UNION ALL  SELECT 3, '1','2','7','9'
UNION ALL  SELECT 4, '1','4','7','6'
delete Tb1 where [id] not in (select max([id]) from Tb1 group by a,b )
select * from tb1
 
drop table tb1
 

如果要同时删除第一和第三行
即如下结果:
a b c d
1 5 3 5
语句如下:
 

复制代码 代码示例:
delete m from tb t
inner join
(
select a ,b
from tb
group by a , b
having count(*)>1
)n
on m.a = n.a and m.b = n.b

delete * from tb as m,
(
select a ,b
from tb
group by a , b
having count(*)>1
)n
where m.a = n.a and m.b = n.b

在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢?谢谢!
1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断
 

复制代码 代码示例:
select * from people
where peopleId in (select  peopleId  from  people  group  by  peopleId  having  count(peopleId) > 1)

2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录
 

复制代码 代码示例:
delete from people
where peopleId  in (select  peopleId  from people  group  by  peopleId   having  count(peopleId) > 1)
and rowid not in (select min(rowid) from  people  group by peopleId  having count(peopleId )>1)

3、查找表中多余的重复记录(多个字段)
 

复制代码 代码示例:
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq  having count(*) > 1)

4、删除表中多余的重复记录(多个字段),只留有rowid最小的记录
 

复制代码 代码示例:
delete from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

5、查找表中多余的重复记录(多个字段),不包含rowid最小的记录
 

复制代码 代码示例:
select * from vitae a
where (a.peopleId,a.seq) in  (select peopleId,seq from vitae group by peopleId,seq having count(*) > 1)
and rowid not in (select min(rowid) from vitae group by peopleId,seq having count(*)>1)

你的表mailrecord里面含有text、ntext 或 image类型的字段
不能以 DISTINCT 方式选择 text、ntext 或 image 数据类型!

楼上几位的方法只能处理非text、ntext 或 image类型的记录
对于text、ntext 或 image类型的字段重复的删除好象还没有别的办法。。。
如果要保持text、ntext 或 image这些字段唯一那有些麻烦。
因为数据库不对这些字段进行索引。要保证唯一必须采用存储过程或外部过程同时保存该数据的Key并对Key进行唯一索引。

比如说,你可以在把一个Text字段提交数据库之前计算它的MD5值或Hash值,然后把该值进行索引,基本上就能保证字段唯一了。

建议不要用in,用exists。