您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

SQL查出一张表中重复的所有记录数据

2024/3/31 20:07:36发布14次查看
1、在面试的时候碰到一个 问题,就是让写一张表中有id和name 两个字段,查询出name重复的所有数据,现在列下:
select * from xi a where (a.username) in (select username from xi group by username having count(*) > 1)
2、查询出所有数据进行分组之后,和重复数据的重复次数的查询数据,先列下:
select count(username) as '重复次数',username from xi group by username having count(*)>1 order by username desc
3、一下为 查看别人的 结果,现列下:查询及删除重复记录的方法大全
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)
另外,mysql中使用上面的sql会报错:you can't specify target table 'xxx' for update in from clause,不能在修改表的同时去查询同一张表,因此可以像下面的语句一样,将查询结果命名为一张临时表来作为修改表数据的条件,以规避上述错误。
delete from user where user_id in( (select user_id from (select c.* from cab_user c where c.extra_id in (select a.extra_id from user a group by a.extra_id having count(a.extra_id) > 1) and c.user_id not in (select min(b.user_id) from user b group by b.extra_id having count(b.extra_id )>1) ) d ) )
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)
(二)
比方说
在a表中存在一个字段“name”,
而且不同记录之间的“name”值有可能会相同,
现在就是需要查询出在该表中的各记录之间,“name”值存在重复的项;
select name,count(*) from a group by name having count(*) > 1
如果还查性别也相同大则如下:
select name,sex,count(*) from a group by name,sex having count(*) > 1
(三)
方法一declare @max integer,@id integerdeclare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1open cur_rowsfetch cur_rows into @id,@maxwhile @@fetch_status=0beginselect @max = @max -1set rowcount @maxdelete from 表名 where 主字段 = @idfetch cur_rows into @id,@maxendclose cur_rowsset rowcount 0
方法二"重复记录"有两个意义上的重复记录,一是完全重复的记录,也即所有字段均重复的记录,二是部分关键字段重复的记录,比如name字段重复,而其他字段不一定重复或都重复可以忽略。
1、对于第一种重复,比较容易解决,使用select distinct * from tablename就可以得到无重复记录的结果集。如果该表需要删除重复的记录(重复记录保留1条),可以按以下方法删除select distinct * into #tmp from tablenamedrop table tablenameselect * into tablename from #tmpdrop table #tmp发生这种重复的原因是表设计不周产生的,增加唯一索引列即可解决。
2、这类重复问题通常要求保留重复记录中的第一条记录,操作方法如下假设有重复的字段为name,address,要求得到这两个字段唯一的结果集select identity(int,1,1) as autoid, * into #tmp from tablenameselect min(autoid) as autoid into #tmp2 from #tmp group by name,autoidselect * from #tmp where autoid in(select autoid from #tmp2)最后一个select即得到了name,address不重复的结果集(但多了一个autoid字段,实际写时可以写在select子句中省去此列)
(四)查询重复
select * from tablename where id in (select id from tablenamegroup by idhaving count(id) > 1)
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product