首页 > 数据库 >SQL查询重复记录操作

SQL查询重复记录操作

时间:2023-11-08 15:32:46浏览次数:31  
标签:count group 查询 peopleId rowid SQL 重复记录 select


假设现有一张人员表(表名:Person),若想将姓名、身份证号、住址这三个字段完全相同的记录查找出来,使用

1:  SELECT p1.*   
   2:  FROM persons   p1,persons   p2   
   3:  WHERE p1.id<>p2.id   
   4:  AND p1.cardid   =   p2.cardid   
   5:  AND p1.pname   =   p2.pname   
   6:  AND p1.address   =   p2.address

可以实现该功能。



删除重复记录的SQL语句


1、用rowid方法


据据oracle带的rowid属性,进行判断,是否存在重复,语句如下: 


查数据: 


删数据: 

delete   from table1 a where rowid !=(select   max(rowid)    

      from table1 b where a.name1=b.name1 and a.name2=b.name2......)

2、group by方法


查数据: 


删数据: 

select count(num), max(name) from student --列出重复的记录数,并列出他的name属性  

 group by num  

 having count(num) >1 --按num分组后找出表中num列重复,即出现次数大于一次
delete from student  

 group by num  

 having count(num) >1

这样的话就把所有重复的都删除了。


3、用distinct方法 -对于小的表比较有用

create table table_new as   select distinct *   from table1 minux  

 truncate table table1;  

 insert into table1 select * from table_new;



查询及删除重复记录的方法大全 


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)

(二) 比方说 在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 integer 



 declare cur_rows cursor local for select 主字段,count(*) from 表名 group by 主字段 having count(*) >; 1 



 open cur_rows 



 fetch cur_rows into @id,@max 



 while @@fetch_status=0 



 begin 



 select @max = @max -1 



 set rowcount @max 



 delete from 表名 where 主字段 = @id 



 fetch cur_rows into @id,@max 



 end 



 close cur_rows 



 set rowcount 0


方法二




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




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



select distinct * from tableName


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




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



select distinct * into #Tmp from tableName 



 drop table tableName 



 select * into tableName from #Tmp 



 drop table #Tmp


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




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




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



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)


最后一个select即得到了Name,Address不重复的结果集(但多了一个autoID字段,实际写时可以写在select子句中省去此列)




(四) 查询重复



select * from tablename where id in ( 


 select id from tablename 


 group by id 


 having count(id) > 1)

标签:count,group,查询,peopleId,rowid,SQL,重复记录,select
From: https://blog.51cto.com/u_809530/8255443

相关文章

  • mysql 远端数据库的数据备份与恢复
    备份基本语法mysqldump-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名称]>/home/username/备份文件.sql例如mysqldump-uroot-p123456-h192.168.1.100-P3306mydb>mydb_backup.sql恢复基本语法mysql-u[用户名]-p[密码]-h[主机IP]-P[端口号][数据库名......
  • 坏块处理postgresql
    问题概述现场实施发来求救,简单查询数据表报错, 业务应用出现异常select*frommiddXXXXX.t_geo_mv_xxxxxegment_var;ERROR:missingchuunknumber0fortoastvalue142340922inpg_toast_2619问题原因此报错信息一般为数据库中有坏块导致。https://www.postgresql.org/mes......
  • MySQL学习(13)内存中的数据——Buffer Pool
    BufferPool是什么BufferPool就是MySQL服务器启动时向操作系统申请的一片连续的内存。默认情况下,BufferPool的容量为128MB。SHOWVARIABLESLIKE'innodb_buffer_pool_%'; 可以通过启动项innodb_buffer_pool_size设置(单位为字节),不能设置小于5MB。[server]innodb_buf......
  • MySQL的存储引擎、事务补充、MySQL的锁机制、MySQL的日志
    MySQL的存储引擎概述数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL的核心就是存储引擎。用户可......
  • Burp联动Sqlmap插件进行sql注入扫描
    一、插件介绍sqlmap4burp++是一款兼容Windows,mac,linux多个系统平台的Burp与sqlmap联动插件这个插件嘎嘎好用,大大提升了sqlmap的效率项目地址https://github.com/c0ny1/sqlmap4burp-plus-plusgithub中间有空格,把空格去掉在进行访问即可进入burp拓展模块点击添加上传文件......
  • 解决升级到 Delphi 12 后遇到 SQLite 不兼容的问题
    今天升级到Delphi12后,编译运行原来的项目,出现“[FireDAC][Phys][SQLite][sqlite3]-303.Capabilityisnotsupported”的错误。经过查找文档,发现是FireDACSQLite版本更新导致的。RADStudio12.0支持SQLite3.42,同时保留了使用FireDAC加密(FDE)的SQLite3.31.1的选项......
  • Adding empty space into SQL Server Reporting Services
    REF:http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1400080&SiteID=1(1)Ratherthaninsertingspaces,canyouadjustthepaddingpropertyonthetextbox?Ifyougoalistohavethefieldindented,thatshouldwork.(2)Anyreasonyoucouldn'......
  • SQL Server 事务处理 回滚事务
     创建表:SETANSI_NULLSONGOSETQUOTED_IDENTIFIERONGOCREATETABLE[dbo].[t1]([Id][int]NOTNULL,[c1][nvarchar](50)NULL,[c2][datetime]NULL,CONSTRAINT[PK_Table1]PRIMARYKEYCLUSTERED([Id]ASC)WITH(PAD_INDEX=OFF,S......
  • SQL Server 2005透视表运算符PIVOT应用示例
    SQLServer2005行列转换 有用SQL写过交叉报表的,往往都比较头痛,还好现在SQL2005中提供了新的PIVOT操作符,可以很简单地写出交叉数据查询。正好前两天在研究ORACLE最新的11G版本提供的新特性,发现ORACLE11G也同样推出这个新PIVOT,而且语法格式也几乎是一样的,呵,看来这些主流的数据库都......
  • 运行Springboot测试类查询数据库数据显示白网页
    问题运行Springboot测试类时,查询数据库里面数据显示如下白网页程序报如下错误 解决方案 SpringBoot应用未能启动的原因是它没有找到合适的数据库配置具体来说,它需要一个数据源(DataSource),但未能在你的配置中找出,也没有找到任何嵌入式数据库(H2,HSQL或Derby)以下是几个......