注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

PostgreSQL 中文网

 
 
 

日志

 
 

PostgreSQL: 如何删除单表重复数据?  

2012-02-06 16:15:09|  分类: Postgres基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

 
 
         今天在导入一张表数据时遇到重复数据问题,以前在维护 Oracle 时也遇到过, Oracle
库去重的方法很多,常用的是根据 rowid 进行去重,那么 PostgreSQL 库如何去除单表重复数据
呢,可以通过 ctid 进行,下面是实验过程:

        另:关于 ctid 的解释,可以参考之前的blog
http://francs3.blog.163.com/blog/static/405767272010111010526435/


--1 创建测试表并插入初始数据
mydb=> create table test_name (id integer,name varchar(32));
CREATE TABLE

mydb=> insert into test_name values (1,'francs');
INSERT 0 1
mydb=> insert into test_name values (1,'francs');
INSERT 0 1
mydb=> insert into test_name values (1,'francs');
INSERT 0 1
mydb=> insert into test_name values (2,'fpZhou');
INSERT 0 1
mydb=> insert into test_name values (2,'fpZhou');
INSERT 0 1
mydb=> insert into test_name values (3,'A');
INSERT 0 1
mydb=> insert into test_name values (4,'B');
INSERT 0 1
mydb=> insert into test_name values (5,'C');
INSERT 0 1

 备注:实验场景,目标是去除 id 字段重复的数据。


--2 查询初始化数据
mydb=> select * from test_name;
 id |  name 
----+--------
  1 | francs
  1 | francs
  1 | francs
  2 | fpZhou
  2 | fpZhou
  3 | A
  4 | B
  5 | C
(8 rows)


--3 查询重复的记录
mydb=> select distinct id ,count(*) from test_name group by id having count(*) > 1;
 id | count
----+-------
  1 |     3
  2 |     2
(2 rows)

  备注:上面查询出 id 为1 的记录有 3条, id 为 2的记录有两条。


--4 查询重复的数据(即将删除的数据
mydb=> select *      
  from test_name a
 where a.ctid not in (select min(ctid) from test_name b group by id);
 id |  name 
----+--------
  1 | francs
  1 | francs
  2 | fpZhou
(3 rows)

  备注:上面查询列出重复的数据(即将删除的数据)。
 

mydb=> select ctid,* from test_name where name='francs';
 ctid  | id |  name 
-------+----+--------
 (0,1) |  1 | francs
 (0,2) |  1 | francs
 (0,3) |  1 | francs
(3 rows)

mydb=> select min(ctid) from test_name where name='francs';
  min 
-------
 (0,1)
(1 row)


--5 删除重复的数据
mydb=> delete from test_name a
mydb->  where a.ctid not in (select min(ctid) from test_name b group by id);
DELETE 3


--6 再次查询
mydb=> select * from test_name order by id;
 id |  name 
----+--------
  1 | francs
  2 | fpZhou
  3 | A
  4 | B
  5 | C
(5 rows)


--7 总结
    上述实验是通过表记录的 tid 来进行去重的,也可以根据业务需要,对表上的字段进行分析做为去重字段。


--8  也可以使用以下SQL 删除重复数据

delete from test_name a
where a.ctid <>
(
select max(b.ctid) from test_name b
where a.id = b.id 
);

      备注:在表数据量较大的情况下,这种删除方法效率很高。

  评论这张
 
阅读(29998)| 评论(2)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016