更新时间: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;
父主题: 数据库使用入门