zoukankan      html  css  js  c++  java
  • rowid去重(删除表的重复记录)

    -- 构造测试环境
    SQL> create table andy(id int,name varchar2(10));
    Table created.
    SQL>
    insert into andy values(1,'a');
    insert into andy values(2,'b');
    insert into andy values(3,'c');
    insert into andy values(4,'d');
    SQL> select * from andy;

    ID NAME
    ---------- ----------
    1 a
    2 b
    3 c
    4 d
    4 rows selected.
    SQL>
    insert into andy values(4,'f');
    insert into andy values(4,'d');

    SQL> select * from andy;
    ID NAME
    ---------- ----------
    1 a
    2 b
    3 c
    4 d
    4 f
    4 d
    6 rows selected.
    -- 依次group by 表所有字段,通过min(rowid)查看所有唯一记录(去重记录,也就是相同多行数据只显示一行)
    SQL> select id,name,min(rowid)
    from andy
    group by id,name;
    ID NAME MIN(ROWID)
    ---------- ---------- ------------------
    3 c AAAfKTAAEAAACr/AAC
    4 d AAAfKTAAEAAACr/AAD
    4 f AAAfKTAAEAAACr/AAJ
    1 a AAAfKTAAEAAACr/AAA
    2 b AAAfKTAAEAAACr/AAB
    -- delete 重复数据时,group by 表的个别字段,发现误删除
    SQL> delete from andy
    where rowid not in (
    select min(rowid)
    from andy
    group by id);
    2 rows deleted.
    说明:记录 4 f 被误删。
    SQL> select * from andy;

    ID NAME
    ---------- ----------
    1 a
    2 b
    3 c
    4 d
    -- 构造与上面测试相同环境,即插入刚删除的数据
    SQL>
    insert into andy values(4,'f');
    insert into andy values(4,'d');
    SQL> select * from andy;
    ID NAME
    ---------- ----------
    1 a
    2 b
    3 c
    4 d
    4 f
    4 d
    6 rows selected.
    -- 依次group by 表所有字段,通过min(rowid)查看所有唯一记录(去重记录,也就是相同多行数据只显示一行)
    SQL> select id,name,min(rowid)
    from andy
    group by id,name;
    ID NAME MIN(ROWID)
    ---------- ---------- ------------------
    3 c AAAfKTAAEAAACr/AAC
    4 d AAAfKTAAEAAACr/AAD
    4 f AAAfKTAAEAAACr/AAL
    1 a AAAfKTAAEAAACr/AAA
    2 b AAAfKTAAEAAACr/AAB
    -- delete 重复数据时,group by 表的所有字段,发现没有误删。
    SQL> delete from andy
    where rowid not in (
    select min(rowid)
    from andy
    group by id,name);
    1 row deleted.
    -- 检查去重后的数据,发现没有误删
    SQL> select * from andy;
    ID NAME
    ---------- ----------
    1 a
    2 b
    3 c
    4 d
    4 f
    说明:
    如果想通过rowid去重,那么在 delete 重复数据时,需要group by 表的所有字段。如果只group by 表的个别字段,那么会造成误删除。

  • 相关阅读:
    ZR#330. 【18 提高 3】矿石(容斥)
    牛客NOIP提高组R1 C保护(主席树)
    BZOJ1026: [SCOI2009]windy数(数位dp)
    AtCoderBeginnerContest109题解
    BZOJ3679: 数字之积(数位dp)
    牛客NOIP普及组R1 C括号(dp)
    牛客NOIP提高组R1 A中位数(二分)
    BZOJ1576: [Usaco2009 Jan]安全路经Travel(最短路 并查集)
    ZRDay6A. 萌新拆塔(三进制状压dp)
    Python 入门教程 10 ---- Student Becomes the Teacher
  • 原文地址:https://www.cnblogs.com/andy6/p/6900926.html
Copyright © 2011-2022 走看看