rowid删除重复信息记录

create table stu(no number,name varchar2(10),sex char(2));


insert into STU_TMP values(1, 'ac','男');
insert into STU_TMP values(1, 'ac','男');
insert into STU_TMP values(1, 'bb','女');
insert into STU_TMP values(1, 'ab','男');

SELECT ROWID,STU_TMP.* FROM STU_TMP

    ROWID NO NAME SEX
1 AADXtrAA9AAIB8eAAA 1 ac
2 AADXtrAA9AAIB8eAAB 1 ac
3 AADXtrAA9AAIB8eAAC 1 bb
4 AADXtrAA9AAIB8eAAD 1 ab

 

关于rowid的理解:
(1)SELECT * FROM STU_TMP X

            WHERE ROWID!=(SELECT MAX(ROWID) FROM STU_TMP Y WHERE Y.NO=X.NO)

SELECT MAX(ROWID) FROM STU_TMP Y WHERE Y.NO=X.NO选出的是rowid最大的记录,即第四行:AADXtrAA9AAIB8eAAD

!=第四行的记录,即选出前三行的记录:

    NO NAME SEX
1 1 ac
2 1 ac
3 1 bb

(2)利用rowid删除重复行数据

delete from STU_TMP where rowid in (select a.rowid from STU_TMP a, STU_TMP b where a.rowid>b.rowid and a.no=b.no and a.name= b.name and a.sex=b.sex)

--a.no=b.no and a.name= b.name and a.sex=b.sex说明数据一样,然后再删掉rowid大的那条记录。

--当只有一条重复数据时,会删掉第二条记录,rowid=AADXtrAA9AAIB8eAAB-->2, 'ac','男'

--再插入新的数据试试n条记录的删除:

insert into STU_TMP values(1, 'ab','男');
insert into STU_TMP values(1, 'ab','男');

insert into STU_TMP values(1, 'ac','男');

    ROWID NO NAME SEX
1 AADXtrAA9AAIB8eAAA 1 ac
2 AADXtrAA9AAIB8eAAC 1 bb
3 AADXtrAA9AAIB8eAAD 1 ab
4 AADXtrAA9AAIB9eAAE 1 ab
5 AADXtrAA9AAIB10eAAF 1 ab
6 AADXtrAA9AAIB11eAAG 1 ac

运行命令:delete from STU_TMP where rowid in (select a.rowid from STU_TMP a, STU_TMP b where a.rowid>b.rowid and a.no=b.no and a.name= b.name and a.sex=b.sex)

得:

    ROWID NO NAME SEX
1 AADXtrAA9AAIB8eAAA 1 ac
2 AADXtrAA9AAIB8eAAC 1 bb
3 AADXtrAA9AAIB8eAAD 1 ab

(3)利用rowid结合max、min函数删除重复行数据

使用rowid快速唯一确定重复行结合max或min函数来实现删除重复行。

SQL>delete from stu a

where rowid not in (

select max(b.rowid) from stu b

where a.no=b.no

and a.name = b.name

and a.sex = b.sex); //这里max使用min也可以或者用下面的语句

SQL>delete from stu a where rowid < (select max(b.rowid) from stu b where a.no=b.no and a.name = b.name and a.sex = b.sex);       //这里如果把max换成min的话,前面的where子句中需要把"<"改为">"

跟上面的方法思路基本是一样的,不过使用了group by,减少了显性的比较条件,提高效率。

SQL>delete from stu where rowid not in (

select max(rowid) from stu t

 group by t.no,

 t.name,

 t.sex );

 

思考:若在stu表中唯一确定任意一行数据(1, 'ab',’男’),把sex字段更新为”女”,怎么做?

       SQL>update stu set sex=’女’ where rowid=(select min(rowid) from stu where no=1 and name=’ab’ and sex=’男’);

 

posted on 2016-05-30 12:29  EchoLong333  阅读(180)  评论(0编辑  收藏  举报

导航