delete from fee where rowid not in 
(select min(rowid from fee a group by a.loginname having count(*)>1))

解决方案 »

  1.   

    delete from fee a where rowid>
    (select min(rowid) from fee b where a.loginname=bloginname and a.id=b.id and a.permission=b.permission)
      

  2.   

    delete from tab a where a.rowid>(select min(b.rowid) from tab b where a.loginname=b.loginname and a.ID=b.ID and a.permission=b.permission)
      

  3.   

    我想应该可以做一个临时表,把distinct的数据查到临时表,然后在倒过来。如果你只是做一次这样的工作。
      

  4.   

    select *  from tbl
    having count(*) >1 group by loginname,id,permission
    ;
    delete from tbl a where
    rowid >( select rowid  from tbl x where x.loginname=a.loginname and
    x.id=a.id and a.permission=x.permission)
      

  5.   

    我的看法
    建立一张含有loginname,I,permission的表[tbl_test]
    你原来的表假设是tbl_info
    用一个过程来完成create or replace procedure sp_insert_tbl_info
    as
    begin
        insert into tbl_test select loginname,I,permission 
                               from  tbl_info
                           group by  loginname,I,permission; 
       execute immediate 'drop table tbl_info ';
       execute immediate 'create tbl_info as select * from tbl_test ';end;
      

  6.   

    首先感谢大家的回复。我使用的语句是:
    delete from a where a.rowid!=(select max(rowid) from a b where a.loginname=b.loginname and a.permission=b.permission);虽然问题是解决了,但是我还是对这条语句有点不太明白。where子句中的a.rowid到底起着一个什么作用?为什么用这个rowid就可以将这些相同的记录给找出来?
      

  7.   

    rowid可以看作一个主键,每条记录都不一样的
    而以上的语句,目的就是从多个重复记录中选出一个记录的ROWID,然后在删除其他rowid
      

  8.   

    rowid记录的物理存储地址.相当于邮递员送信时要找的投递地址.每一个记录的物理地址都是不一样的.你可以这么看.找两条一样的记录(其实是不一样的),然后
    select rowid from table where loginname='jim' 就可以看到不同的rowid.
      

  9.   

    delete tableA a where a.rowid in (select min(b.rowid) from tableA b where a.pk=b.pk(主键))
      

  10.   

    to  WHAPHY() :    主键不是不能重复吗?a.pk=b.pk是不是有点问题?