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=# 

說明:在表數據量較大的情況下,這種刪除方法效率很高。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM