当前位置:首页 > PHP教程 > PHP总结归纳

sql查询重复记录、删除重复记录方法大全

  查找所有重复标题的记录:

?

1

select * from t_info a where ((select count(*) from t_info where title = a.title) > 1) order by title desc

  一、查找重复记录

  1、查找全部重复记录

?

1

select * from 表 where 重复字段 in (select 重复字段 from 表 group by 重复字段 having count(*)>1)

  2、过滤重复记录(只显示一条)

?

1

select * from hzt where id in (select max(id) from hzt group by title)

  注:此处显示id最大一条记录

  二、删除重复记录

  1、删除全部重复记录(慎用)

?

1

delete 表 where 重复字段 in (select 重复字段 from 表 group by 重复字段 having count(*)>1)

  2、保留一条(这个应该是大多数人所需要的 ^_^)

?

1

delete hzt where id not in (select max(id) from hzt group by title)

  注:此处保留id最大一条记录

  三、举例

  1、查找表中多余的重复记录,重复记录是根据单个字段(peopleid)来判断

?

1

select * from people where peopleid in (select peopleid from people group by peopleid having count(peopleid) > 1)

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

?

1

2

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、查找表中多余的重复记录(多个字段)

?

1

select * from vitae a where (a.peopleid,a.seq) in (select peopleid,seq from vitae group by peopleid,seq having count(*) > 1)

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

?

1

2

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最小的记录

?

1

2

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)

  四、补充

  有两个以上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如name字段重复,而其他字段不一定重复或都重复可以忽略。

  1、对于第一种重复,比较容易解决,,使用

?

1

select distinct * from tablename

  就可以得到无重复记录的结果集。

  如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除

?

1

2

3

4

select distinct * into #tmp from tablename

drop table tablename

select * into tablename from #tmp

drop table #tmp

  发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。

  2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下

  假设有重复的字段为name,address,要求得到这两个字段唯一的结果集

?

1

2

3

select identity(int,1,1) as autoid, * into #tmp from tablename

select min(autoid) as autoid into #tmp2 from #tmp group by name,autoid

select * from #tmp where autoid in(select autoid from #tmp2)


【说明】本文章由站长整理发布,文章内容不代表本站观点,如文中有侵权行为,请与本站客服联系(QQ:)!