查重 查重复记录 删除重复记录

 select * from b;

        ID        AID NAME
---------- ---------- --------------------------------------------------------------------------------
         1          1 b1
         2          2 b2
         3          2 b2
         4          2 b3

  

这是表的记录   :

--根据 aid 和 name 进行同时查询 :

--第一种

select * from b  b1 where exists ( select 1 from b b2 where b1.aid=b2.aid and b1.name=b2.name group by b2.aid,b2.name  having count(1)>1);
 

--第二种

select b1.* from b b1,b b2 where b1.aid=b2.aid and b1.name=b2.name and b1.id<>b2.id;

  

--第三种

select * from b b1 where b1.aid in( select aid from b b2  group by b2.aid,b2.name  having count(1)>1) and b1.name in(select name from b b2  group by b2.aid,b2.name  having count(1)>1);

--上面可以优化

select * from b b1 where (b1.aid,b1.name) in( select aid,name from b b2  group by b2.aid,b2.name  having count(1)>1);

  

--如果只是根据一个字段进行查询呢 上面的进行修改,应该很简单了 为什么第一个sql 中要查询1 呢 效率上 1>aid>* exits 里面只是true或者false 所以查询什么都可以

下面是网上摘抄的 没有进行验证的  : 可以参考

- 比如现在有一人员表 (表名:peosons)

- 若想将姓名、身份证号、住址这三个字段完全相同的记录查询出来

- select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address

-

- 可以实现上述效果.

-

- 几个删除重复记录的SQL语句

-

- 1.用rowid方法

-

- 2.用group by方法

-

- 3.用distinct方法

-

-

- 1。用rowid方法

-

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

- 查数据:

- select * from table1 a where rowid !=(select max(rowid)

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

- 删数据:

- 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

- )

时间: 2024-10-13 01:23:55

查重 查重复记录 删除重复记录的相关文章

[华为机试练习题]15.删除重复字符/删除重复字符串

题目 题目标题: 删除重复字符 给定一个字符串,将字符串中所有和前面重复多余的字符删除,其余字符保留,输出处理后的字符串.需要保证字符出现的先后顺序,并且区分大小写. 详细描述: 接口说明 原型: int GetResult(const char *input, char *output) 输入参数: input 输入的字符串 输出参数(需考虑指针指向的内存区域是否有效): output 输出的字符串 返回值: 0 成功 -1 失败及异常 举例: 输入: abadcbad,那么该单词中红色部分的

MySQL中删除重复记录

工作中,我们经常有需要删除一些重复数据的这种需求.重复数据可能是程序bug造成的 好,让我们看看如何删除这些重复数据 删除重复数据的思路呢,是这样的,查看根据这个重复字段分组后的结果有没有大于1的情况如果有大于的1的情况呢,那就说明是有重复数据的! 1) 创建数据库 create database ceshi; 2) 创建表 CREATE TABLE t1 ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(20) not nu

Windows 8.1 重复数据删除——规划部署(二)

一.规划部署目标   Windows 8.1&Server 2012 的重复数据删除设计为安装到主要数据卷上,而无需添加任何附加的专用硬件.这意味着你可以安装和使用该功能,而不会影响服务器上的主要工作负载.默认设置为非侵入性的,因为它们允许在处理特定文件之前数据"存留时间"达到五天,默认的最小文件大小为 32 KB.该实现是为低内存和 CPU 利用率而设计的.如果内存利用率变高,则重复数据删除功能将等待可用的资源.管理员可以根据所涉及数据的类型以及该卷或特定文件类型的更改频率和

何时使用重复数据删除技术?

大数据与海量数据已经成为数据中心的主要业务,而重复数据删除与压缩是可以节约大量数据存储的技术. 只有备份还不够.重复数据删除与压缩即将成为主存储的必备功能. 重复数据删除是一种压缩技术,通过识别重复内容,进行去重,并在对应的存储位置留下指针,来最小化数据量.这个指针通过给定大小的数据模式进行哈希创建. 也许在于你已经在备份系统上实施了重复数据删除备份和归档多年,问题在于:是否需要在主存储上运用重复数据删除与压缩技术? 并非所有的重复数据删除技术都一样.IT专业人士在将其添加到主存储环境之前,应该

Mysql删除重复记录,保留id最小的一条

mysql 查询重复字段,及删除重复记录的方法MySQL, 数据库, 数据库, 字段, 服务器数据库中有个大表,需要查找其中的名字有重复的记录id,以便比较.如果仅仅是查找数据库中name不重复的字段,很容易:SELECT min(`id`),`name` FROM `table` GROUP BY `name`; 但是这样并不能得到说有重复字段的id值.(只得到了最小的一个id值)查询哪些字段是重复的也容易:SELECT `name`,count(`name`) as count FROM `

sql语句查询同一表内多字段同时重复的记录 sql数据库重复记录删除

分享下用sql语句删除数据库中重复记录的方法.比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来select p1.* from persons p1,persons p2 where p1.id<>p2.id and p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address = p2.address可以实现上述效果.几个删除重复记录的SQL语句 1.用rowid方法2.用gr

ORACLE查询并删除重复记录

查询及删除重复记录的SQL语句 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select * from peoplewhere peopleId in (select   peopleId from   people group by   peopleId having count(peopleId) > 1) 2.删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录delete from people where

ORACLE查询删除重复记录三种方法

本文列举了3种删除重复记录的方法,分别是rowid.group by和distinct,小伙伴们可以参考一下. 比如现在有一人员表 (表名:peosons) 若想将姓名.身份证号.住址这三个字段完全相同的记录查询出来 代码如下: select p1.*   from persons  p1,persons  p2   where p1.id<>p2.id   and  p1.cardid = p2.cardid and p1.pname = p2.pname and p1.address =

mysql删除重复记录语句的方法

例如: id name value 1 a pp 2 a pp 3 b iii 4 b pp 5 b pp 6 c pp 7 c pp 8 c iii id是主键 要求得到这样的结果 id name value 1 a pp 3 b iii 4 b pp 6 c pp 8 c iii 方法1 delete YourTable where [id] not in ( select max([id]) from YourTable group by (name + value)) 方法2 delet