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) 编辑 收藏 举报