删除重复记录

方法原理: 
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的, 
  rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。 
2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中 
  那些具有最大rowid的就可以了,其余全部删除。 
实现方法:

SQL> create table a (
 2 bm char(4), --编码
 3 mc varchar2(20) --名称
 4 )
 5 /

SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- -------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111

查询到8记录.

查出重复记录

SQL> select rowid,bm,mc from a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);
ROWID BM MC
------------------ ---- --------------------
000000D5.0000.0002 1111 1111
000000D5.0001.0002 1112 1111
000000D5.0002.0002 1113 1111
000000D5.0003.0002 1114 1111
SQL> delete from a a where a.rowid!=(select max(rowid) from a b where a.bm=b.bm and a.mc=b.mc);

删除4个记录.

SQL> select rowid,bm,mc from a;
ROWID BM MC
------------------ ---- --------------------
000000D5.0004.0002 1111 1111
000000D5.0005.0002 1112 1111
000000D5.0006.0002 1113 1111
000000D5.0007.0002 1114 1111
时间: 2024-12-12 04:54:13

删除重复记录的相关文章

Oracle查询重复数据与删除重复记录方法

比如现在有一人员表 (表名:peosons) drop table PERSONS; create table PERSONS ( PNAME VARCHAR2(50), CARDID VARCHAR2(18), ADDRESS VARCHAR2(100) ); insert into persons ( PNAME, CARDID, ADDRESS) values ( '张三', '430682199002121010', '深圳'); insert into persons ( PNAME,

初探oracle删除重复记录,只保留rowid最小的记录

如题,初探oracle删除重复记录,只保留rowid最小的记录(rowid可以反映数据插入到数据库中的顺序) 一.删除重复记录可以使用多种方法,如下只是介绍了两种方法(exist和in两种). 1.首先创建一个测试表. create table my_users( id number, username varchar2(20), sal number ) 2.插入测试数据 begin for i in 1..10 loop insert into my_users values(i,'carl

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

1.查询重复记录单字段 select * from tbl a where  exists(select 1 from  tbl b where a.username=b.username group by username  having count(*) > 1) 2.查询重复次数 select clistname,count(clistname) from clalist  group by clistname having count(*)>1 3.删除重复记录,留有rowid最小的记

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

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

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

4.16 删除重复记录

从表中删除重复记录,考虑如下所示的表:create table dupes (id integer,name varchar(10));insert into dupes values (1,'NOPOLEON');insert into dupes values (2,'DYNAMITE');insert into dupes values (3,'DYNAMITE');insert into dupes values (4,'SHE SELLS');insert into dupes val

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 删除重复记录语句

mysql 根据条件删除重复记录 只保留最小id的重复数据 DELETEFROM newsWHERE news_id IN ( SELECT a.news_id FROM ( SELECT news_id FROM news WHERE flag = 1 GROUP BY news_id HAVING count(news_id) > 1 ) a )AND posid NOT IN (SELECT b.posid from ( SELECT min(posid) as posid FROM ne

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

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

mysql 删除重复记录

mysql删除重复记录的原理是: 将需要比较的列放到group by后,取出主键的最小值,再删除不在这个临时表主键的行 命令行格式如下 delete from users  where id not in ( select id from ( select min(id)  from users group by name,sex )  as tmp); 需要比较的列是name和sex,取出id后再从users表中取出id查看该id是否在临时表中存在,不存在则删除掉.