Postgresql去除重复数据的方法

Postgresql删除重复数据

去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。

Oracle 去重的方法很多,常用的是根据 rowid 进行去重。

Postgresql 库如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。

一、创建测试表

david=# create table emp (
david(# id int,
david(# name varchar);
CREATE TABLE
david=#
二、插入测试数据

复制代码
david=# insert into emp values (1,‘david’);
INSERT 0 1
david=# insert into emp values (1,‘david’);
INSERT 0 1
david=# insert into emp values (2,‘sandy’);
INSERT 0 1
david=# insert into emp values (2,‘sandy’);
INSERT 0 1
david=# insert into emp values (3,‘renee’);
INSERT 0 1
david=# insert into emp values (4,‘jack’);
INSERT 0 1
david=# insert into emp values (5,‘rose’);
INSERT 0 1
david=#
复制代码
三、查询初始化数据

复制代码
david=# select ctid,* from emp;
ctid | id | name
——-+—-+——-
(0,1) | 1 | david
(0,2) | 1 | david
(0,3) | 1 | david
(0,4) | 2 | sandy
(0,5) | 2 | sandy
(0,6) | 3 | renee
(0,7) | 4 | jack
(0,8) | 5 | rose
(8 rows)

david=#
复制代码
查询重复数据数

复制代码
david=# select distinct id,count() from emp group by id having count() > 1;
id | count
—-+——-
1 | 3
2 | 2
(2 rows)

david=#
复制代码
查询出 id 为1的记录有3条,id 为2的记录有2条。

四、查询要保留的数据

以 min(ctid) 或 max(ctid) 为准。

复制代码
david=# select ctid,* from emp where ctid in (select min(ctid) from emp group by id);
ctid | id | name
——-+—-+——-
(0,8) | 5 | rose
(5 rows)

david=#
复制代码
五、删除重复数据

david=# delete from emp where ctid not in (select min(ctid) from emp group by id);
DELETE 3
david=#
六、查看最后结果

复制代码
david=# select ctid,8) | 5 | rose
(5 rows)

david=#
复制代码
说明:如果表中已经有标明唯一的序列主键值,可以把该值替换上述的ctid直接删除

七、其他方法

也可以使用以下sql删除重复数据。

复制代码
david=# delete from emp a
david-# where a.ctid <>
david-# (
david(# select min(b.ctid) from emp b
david(# where a.id = b.id
david(# );
DELETE 3
david=#
复制代码
实际情况往往千变万化,我们可能需要加where条件来进行判断,防止删除多的数据,比如我要删除订单号为169769的重复数据,那么我的sql需要这样写
delete from esale_zencart_saleorder_line where order_id=’169769’ and ctid not in ( select min(ctid) from esale_zencart_salorder_line where order_id=’169739’ group by model)
说明:在表数据量较大的情况下,这种删除方法效率很高
原文地址:http://www.cnblogs.com/mchina/archive/2013/04/15/3022086.html

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...