Postgresql去除重复数据的方法

来源:互联网 发布:mac editplus 编辑:程序博客网 时间:2024/05/17 22:30

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 (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,1) | 1 | david
(0,4) | 2 | sandy
(0,6) | 3 | renee
(0,7) | 4 | jack
(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, * from emp;
ctid | id | name
——-+—-+——-
(0,1) | 1 | david
(0,4) | 2 | sandy
(0,6) | 3 | renee
(0,7) | 4 | jack
(0,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

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 车辆转入退档怎么办 校园网总是断网怎么办 校园网经常断网怎么办 身份证号姓名电话号码泄露怎么办 中国邮政银行短信通知怎么办 中通递送不到怎么办 智齿碎了一半怎么办 驾照扣50分怎么办 办不了租赁合同怎么办 收到佰仟律师函怎么办 佰仟律师打电话怎么办 右转车道右方路禁行怎么办 收费站没带现金怎么办 过收费站没有现金怎么办 高速收费站没有现金怎么办 过收费站没现金怎么办 查社保忘记密码怎么办 医保密码忘记了怎么办 买房房东不过户怎么办 转户口金牛区怎么办 高中办休学手续怎么办 电动车灯壳发黄怎么办 买二手车上当了怎么办 成都社保卡遗失怎么办 成都个人怎么办健康证 成都健康证怎么办周末 扶贫办 2020年后怎么办 学历认证通不过怎么办 中考落榜后该怎么办 高考没有填志愿怎么办 上海怎么办人户分离 四级考试被禁考怎么办 高考志愿没填怎么办 腓总神经损伤怎么办 怀孕了没有医保怎么办 卫生间便池堵了怎么办 管道被泥沙堵住怎么办 错过报志愿时间怎么办 报名准考证丢了怎么办 高中毕业证掉了怎么办 军人买不到票怎么办