• 删除表中重复的行数据


    #如下测试表b,如何删除重复值字段:

    SQL> select * from b1; 

    ID NAME

    ---------- ----------         

    1 a         

    1 a         

    1 b         

    2 a

    1 a
    2 a

    #小结:重复值多:则重建表更好、 重复值少,表大,则delete更好

    #方法一:

    group by 分组,找到有效数据,创建一个新表,数据插入,随后删除原表,随后rename 该名称:

    SQL> create table b2 as select * from b1 group by id,name;

    SQL> select * from b2;

      1 a          1 b          2 a

    SQL> drop table b1 purge;

    SQL> alter table b2 rename to b1;

    #方法二:

    找出不符合规则的数据,delete删除

    SQL> select rowid,id,name from b1 where (id,name) in(select id,name from b1 having(count(*))>1 group by id,name);

    ROWID                      ID NAME
    ------------------ ---------- ----------
    AAAV3EAAEAAAAKTAAA          1 a
    AAAV3EAAEAAAAKTAAB          1 a
    AAAV3EAAEAAAAKTAAD          2 a
    AAAV3EAAEAAAAKWAAE          1 a
    AAAV3EAAEAAAAKWAAF          2 a

    #本想通过rownum,最后还是选择rowid  唯一

    #查询符合条件的ROWID:重复行数据中,最小的rowid的value

    SQL> select min(rowid) from b1 group by id,name having(count(*))>1;

    MIN(ROWID) ------------------

    AAAV3EAAEAAAAKTAAA

    AAAV3EAAEAAAAKTAAD

    #删除语法:因为如果表没有任何列是唯一的,那么最好直接使用rowid,稳定唯一:

    找到所有重复记录的value, 排除重复记录中,最小的rowid 保留一行

    SQL>  delete from b1

    where rowid in

    (select rowid from b1 where (id,name)

             in(select id,name from b1 having(count(*))>1 group by id,name))

    and rowid not in

    (select min(rowid) from b1 having(count(*))>1 group by id,name);

    3 rows deleted.

    SQL> select * from b1;

            ID NAME ---------- ----------        

      1 a          1 b          2 a

    SQL> commit;

  • 相关阅读:
    CF980E The Number Games
    UVALive 2995 Image Is Everything
    CF1148F Foo Fighters
    CF22E Scheme
    CF1045G AI robots
    学习笔记 并查集维护区间删除
    HEOI 十二省联考退役记
    立方网面试题总结
    Django学习排错备注
    追求卓越之旅(转)
  • 原文地址:https://www.cnblogs.com/lvcha001/p/8848510.html
Copyright © 2020-2023  润新知