更新时间:2026-07-28 GMT+08:00
分享

如何删除重复的行?

答:可以用如下两种方式。

  • 方式一:
    该方式仅适用于分布表,且关联条件必须包含分布列,对于复制表,相同数据的ctid在各个DN上可能不一致,因此无法使用此方式删除重复行。
    --建表和插入数据。
    gaussdb=# CREATE TABLE tbl_del(c1 varchar,c2 int) distribute by hash(c1);
    gaussdb=# INSERT INTO tbl_del VALUES ('a',1),('a',1);
    gaussdb=# INSERT INTO tbl_del VALUES ('b',2),('b',2);
    gaussdb=# INSERT INTO tbl_del VALUES ('c',3);
    
    --查询去重后的数据。
    gaussdb=# SELECT distinct * FROM tbl_del;
     c1 | c2 
    ----+----
     b  |  2
     a  |  1
     c  |  3
    (3 rows)
    
    --使用如下SQL去除重复的数据。
    gaussdb=# DELETE FROM tbl_del t1 WHERE ctid <>(
        SELECT max(ctid) FROM tbl_del t2 WHERE t1.c1 = t2.c1
    );
    
    --查询数据。
    gaussdb=# SELECT * FROM tbl_del;
     c1 | c2 
    ----+----
     a  |  1
     b  |  2
     c  |  3
    (3 rows)
    
    --删除。
    gaussdb=# DROP TABLE tbl_del;
  • 方式二:
    --建表和插入数据。
    gaussdb=# CREATE TABLE tbl_del(c1 varchar,c2 int);
    gaussdb=# INSERT INTO tbl_del VALUES ('a',1),('a',1);
    gaussdb=# INSERT INTO tbl_del VALUES ('b',2),('b',2);
    gaussdb=# INSERT INTO tbl_del VALUES ('c',3);
    
    --查询去重后的数据。
    gaussdb=# SELECT distinct * FROM tbl_del;
     c1 | c2 
    ----+----
     b  |  2
     a  |  1
     c  |  3
    (3 rows)
    
    --复制一张表tbl_del2。
    gaussdb=# CREATE TABLE tbl_del2 AS SELECT * FROM tbl_del;
    
    --清空tbl_del表,并插入去重后的数据。
    gaussdb=# TRUNCATE TABLE tbl_del;
    gaussdb=# INSERT INTO tbl_del SELECT distinct * FROM tbl_del2;
    
    --查询。
    gaussdb=# SELECT * FROM tbl_del;
     c1 | c2 
    ----+----
     b  |  2
     a  |  1
     c  |  3
    (3 rows)
    
    --删除。
    gaussdb=# DROP TABLE tbl_del,tbl_del2;

相关文档