按照我的理解首先后半部分查询结果是rowid为5的那条记录,在加上前面的语句,执行结果是
把rowid小于5的前四条记录全部删除了
把rowid小于5的前四条记录全部删除了
解决方案 »
- oracle9i for linux(AS3u9) 导入数据失败。
- ORA-04021:执行存储过程报错
- Oracle用函数写的一个例子
- oracle 自定义函数SQL问题
- SQL与PL/SQL有什么区别,什么时候用SQL,什么时候用PL/SQL
- 关于JDBC的一个扑捉异常的问题
- 请问清空某些字段对查询速度又帮助没
- 100分求sqlexpert3.2 for oracle 的下载地址和注册码?
- 无法打开文件:"c:\orant\tools\dbtab60\d2kcnct.sql",developer问题,谢谢!!
- 我买了一套7张的oracle9i盗版碟,怎么装了两分钟就装完了
- HELP? 請問在安裝 oracle 9.2I 的時候會報 ORA-12571 錯誤
- substr严重影响效率,用什么代替呢~
方法原理:
1、Oracle中,每一条记录都有一个rowid,rowid在整个数据库中是唯一的,
rowid确定了每条记录是在ORACLE中的哪一个数据文件、块、行上。
2、在重复的记录中,可能所有列的内容都相同,但rowid不会相同,所以只要确定出重复记录中
那些具有最大rowid的就可以了,其余全部删除。
3、以下语句用到了3项技巧:rowid、子查询、别名。
实现方法:
SQL> create table a (
2 bm char(4), --编码
3 mc varchar2(20) --名称
4 )
5 /
表已建立.
SQL> insert into a values('1111','1111');
SQL> insert into a values('1112','1111');
SQL> insert into a values('1113','1111');
SQL> insert into a values('1114','1111');
SQL> insert into a select * from a;
插入4个记录.
SQL> commit;
完全提交.
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
根据上贴,即你这样做就应该可以了:
delete from music a1 where a1.rowid<>(select max(rowid) from music a2 where a1.id=a2.id )