按照我的理解首先后半部分查询结果是rowid为5的那条记录,在加上前面的语句,执行结果是
把rowid小于5的前四条记录全部删除了

解决方案 »

  1.   

    不是的,它首先是在搜寻重复的记录,就是那个where条件
      

  2.   

    就这个例子来说,a.smnumber=B.smnumber 这个条件好像没用吧
      

  3.   

    是的,a.smnumber=B.smnumber 没有写多了!
      

  4.   

    怎么没有人讲呢,后半部分查询结果是rowid为5的记录,还是返回rowid为4和5的记录呢?
      

  5.   

    那前半部分中的"rowid<"中的rowid是指基准的那条rowid,而不是指表中所有的小于后半部分返回max(rowid)的rowid吧,如果是这样就会把所有小于max(rowid)的记录(例如例子中rowid为1的也会被删除)全部删掉了,
      

  6.   

    转贴 :)如何删除表中重复记录
    方法原理: 
    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 )