【轉】Postgresql去除重複資料的方法
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(
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