删除一个表中的若干记录,条件是:
如果该表中field1列的值的前8位相同,那么将后两位中较小的纪录删除,
举个例子:
如果field1的值有AAAAAAAA01,AAAAAAAA02,AAAAAAAA03,
那么将AAAAAAAA01,AAAAAAAA02对应的纪录删除掉,只剩下AAAAAAAA03对应的纪录。谢谢!

解决方案 »

  1.   

    delete from table
    where field1 not in (select max(field1)over(partition by substr(field1,1,8)) 
    from table
    )
      

  2.   

    SQL> select * from a;        ID FIELD1
    ---------- --------------------
             1 AAAAAAAA01
             2 AAAAAAAA02
             3 AAAAAAAA03
             4 AAAAAAAB01
             5 AAAAAAAC01
             6 AAAAAAAC026 rows selectedSQL> 
    SQL> DELETE FROM a WHERE  ROWID NOT IN
      2  (SELECT MAX(ROWID) FROM a GROUP BY substr(field1, 1, 8));3 rows deletedSQL> select * from a;        ID FIELD1
    ---------- --------------------
             3 AAAAAAAA03
             4 AAAAAAAB01
             6 AAAAAAAC02
      

  3.   

    我没分组,效率不高.
    在SELECT里面都有些重复的东西,我知道GROUP BY也能实现.
      

  4.   

    delete from table
    where field1 not in(
    SELECT substr(field1, 1, 8)||MAX(to_number(field1, 9)) 
    FROM a GROUP BY substr(field1, 1, 8)
    )
      

  5.   

    delete TABLENAME t
        where exists(select 1 from TABLENAME t1 
                         where t1.field1 like substrb(t.field1,1,8)||'%'
                           and t1.field1>t.field1);
      

  6.   

    DELETE FROM a WHERE  ROWID NOT IN
     (SELECT MAX(ROWID) FROM a GROUP BY substr(field1, 1, 8));