zoukankan      html  css  js  c++  java
  • 删除表中重复的行数据

    #如下测试表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;

  • 相关阅读:
    dp思维
    快速幂+地推
    背包问题找物品
    石子合并问题
    hihocoder 1580 Matrix(北京icpc2017网络赛)
    ACM对拍造数据
    主席树学习小结(POJ 2104)
    莫队算法入门 BZOJ 2038
    hdu 2586
    Kattis
  • 原文地址:https://www.cnblogs.com/lvcha001/p/8848510.html
Copyright © 2011-2022 走看看