🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
随笔-102  文章-0  评论-83  # [PostgreSQL删除重复数据](http://www.cnblogs.com/mchina/archive/2013/04/15/3022086.html) 去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。 Oracle 去重的方法很多,常用的是根据 rowid 进行去重。 PostgreSQL 库如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。 **一、创建测试表** ~~~ david=# create table emp ( david(# id int, david(# name varchar); CREATE TABLE david=# ~~~ **二、插入测试数据** [![](https://box.kancloud.cn/2015-10-30_5632e1c360860.gif)]( "复制代码") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c36e7e9.gif)]( "复制代码") **三、查询初始化数据** [![](https://box.kancloud.cn/2015-10-30_5632e1c37c05f.gif)]( "复制代码") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c388ac3.gif)]( "复制代码") 查询重复数据数 [![](https://box.kancloud.cn/2015-10-30_5632e1c396640.gif)]( "复制代码") ~~~ david=# select distinct id, count(*) from emp group by id having count(*) > 1; id | count ----+------- 1 | 3 2 | 2 (2 rows) david=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c3a335b.gif)]( "复制代码") 查询出 id 为1的记录有3条,id 为2的记录有2条。 **四、查询要保留的数据** 以 min(ctid) 或 max(ctid) 为准。 [![](https://box.kancloud.cn/2015-10-30_5632e1c3af5fa.gif)]( "复制代码") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c3bc67d.gif)]( "复制代码") **五、删除重复数据** ~~~ david=# delete from emp where ctid not in (select min(ctid) from emp group by id); DELETE 3 david=# ~~~ **六、查看最后结果** [![](https://box.kancloud.cn/2015-10-30_5632e1c3c7a2e.gif)]( "复制代码") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c3d4fd1.gif)]( "复制代码") 说明:如果表中已经有标明唯一的序列主键值,可以把该值替换上述的ctid直接删除。 **七、其他方法** 也可以使用以下SQL删除重复数据。 [![](https://box.kancloud.cn/2015-10-30_5632e1c3e4ad7.gif)]( "复制代码") ~~~ 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=# ~~~ [![](https://box.kancloud.cn/2015-10-30_5632e1c3f1c21.gif)]( "复制代码") 说明:在表数据量较大的情况下,这种删除方法效率很高。 分类: [Postgresql](http://www.cnblogs.com/mchina/category/381458.html) 标签: [postgresql](http://www.cnblogs.com/mchina/tag/postgresql/), [删除重复数据](http://www.cnblogs.com/mchina/tag/删除重复数据/) 绿色通道: [好文要顶]()[关注我]()[收藏该文]()[与我联系](http://space.cnblogs.com/msg/send/David_Tang)[![](https://box.kancloud.cn/2015-10-30_5632e1c40cc1a.png)]( "分享至新浪微博") [![](https://box.kancloud.cn/2015-10-30_5632e1c41b045.jpg)](http://home.cnblogs.com/u/mchina/) [David_Tang](http://home.cnblogs.com/u/mchina/) [关注 - 1](http://home.cnblogs.com/u/mchina/followees) [粉丝 - 116](http://home.cnblogs.com/u/mchina/followers) [+加关注]() 0 0 (请您对文章做出评价) [« ](http://www.cnblogs.com/mchina/archive/2013/04/15/3010418.html) 上一篇:[PostgreSQL的时间/日期函数使用](http://www.cnblogs.com/mchina/archive/2013/04/15/3010418.html "发布于2013-04-15 11:56") [» ](http://www.cnblogs.com/mchina/archive/2013/04/19/3028573.html) 下一篇:[PostgreSQL 查看数据库,索引,表,表空间大小](http://www.cnblogs.com/mchina/archive/2013/04/19/3028573.html "发布于2013-04-19 09:56") posted @ 2013-04-15 14:47[David_Tang](http://www.cnblogs.com/mchina/) 阅读(89) 评论(0) [编辑](http://www.cnblogs.com/mchina/admin/EditPosts.aspx?postid=3022086)[收藏](#) ![](https://box.kancloud.cn/2015-10-30_5632e1c425f4c.jpg) Copyright ©2013 David_Tang