去重的方法一般是找到重复数据中的一条,以某一唯一条件去掉其他重复值。
Oracle 去重的方法很多,常用的是根据 rowid 进行去重。
Postgresql 库如何去除单表重复数据呢?可以通过 ctid 进行,下面是实验过程。
一、创建测试表
david=# create table emp ( @H_403_12@ david(# id int,@H_403_12@ david(# name varchar); @H_403_12@ CREATE TABLE @H_403_12@ david=# @H_403_12@ 二、插入测试数据
复制代码 @H_403_12@ david=# insert into emp values (1,‘david’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (1,‘david’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (2,‘sandy’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (2,‘sandy’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (3,‘renee’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (4,‘jack’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# insert into emp values (5,‘rose’); @H_403_12@ INSERT 0 1 @H_403_12@ david=# @H_403_12@ 复制代码 @H_403_12@ 三、查询初始化数据
复制代码 @H_403_12@ david=# select ctid,* from emp; @H_403_12@ ctid | id | name @H_403_12@ ——-+—-+——- @H_403_12@ (0,1) | 1 | david @H_403_12@ (0,2) | 1 | david @H_403_12@ (0,3) | 1 | david @H_403_12@ (0,4) | 2 | sandy @H_403_12@ (0,5) | 2 | sandy @H_403_12@ (0,6) | 3 | renee @H_403_12@ (0,7) | 4 | jack @H_403_12@ (0,8) | 5 | rose @H_403_12@ (8 rows)
david=# @H_403_12@ 复制代码 @H_403_12@ 查询重复数据数
复制代码 @H_403_12@ david=# select distinct id,count() from emp group by id having count() > 1; @H_403_12@ id | count @H_403_12@ —-+——- @H_403_12@ 1 | 3 @H_403_12@ 2 | 2 @H_403_12@ (2 rows)
david=# @H_403_12@ 复制代码 @H_403_12@ 查询出 id 为1的记录有3条,id 为2的记录有2条。
四、查询要保留的数据
以 min(ctid) 或 max(ctid) 为准。
复制代码 @H_403_12@ david=# select ctid,* from emp where ctid in (select min(ctid) from emp group by id); @H_403_12@ ctid | id | name @H_403_12@ ——-+—-+——- @H_403_12@ (0,8) | 5 | rose @H_403_12@ (5 rows)
david=# @H_403_12@ 复制代码 @H_403_12@ 五、删除重复数据
david=# delete from emp where ctid not in (select min(ctid) from emp group by id); @H_403_12@ DELETE 3 @H_403_12@ david=# @H_403_12@ 六、查看最后结果
复制代码 @H_403_12@ david=# select ctid,8) | 5 | rose @H_403_12@ (5 rows)
david=# @H_403_12@ 复制代码 @H_403_12@ 说明:如果表中已经有标明唯一的序列主键值,可以把该值替换上述的ctid直接删除。
七、其他方法
复制代码 @H_403_12@ david=# delete from emp a @H_403_12@ david-# where a.ctid <> @H_403_12@ david-# ( @H_403_12@ david(# select min(b.ctid) from emp b @H_403_12@ david(# where a.id = b.id @H_403_12@ david(# ); @H_403_12@ DELETE 3 @H_403_12@ david=# @H_403_12@ 复制代码 @H_403_12@ 实际情况往往千变万化,我们可能需要加where条件来进行判断,防止删除多的数据,比如我要删除订单号为169769的重复数据,那么我的sql需要这样写 @H_403_12@ 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) @H_403_12@ 说明:在表数据量较大的情况下,这种删除方法效率很高 @H_403_12@ 原文地址:http://www.cnblogs.com/mchina/archive/2013/04/15/3022086.html