去重的方法一般是找到重複資料中的一條,以某一唯一條件去掉其他重複值。
Oracle 去重的方法很多,常用的是根據 rowid 進行去重。
PostgreSQL 庫如何去除單表重複資料呢?可以通過 ctid 進行,下面是實驗過程。
一、建立測試表
david=# create table emp (david(# id int,david(# name varchar);CREATE TABLEdavid=#
二、插入測試資料
david=# insert into emp values (1, 'david');INSERT 0 1david=# insert into emp values (1, 'david');INSERT 0 1david=# insert into emp values (1, 'david');INSERT 0 1david=# insert into emp values (2, 'sandy');INSERT 0 1david=# insert into emp values (2, 'sandy');INSERT 0 1david=# insert into emp values (3, 'renee'); INSERT 0 1david=# insert into emp values (4, 'jack'); INSERT 0 1david=# insert into emp values (5, 'rose'); INSERT 0 1david=#
三、查詢初始化資料
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 3david=#
六、查看最後結果
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 adavid-# where a.ctid <>david-# (david(# select min(b.ctid) from emp bdavid(# where a.id = b.iddavid(# );DELETE 3david=#
說明:在表資料量較大的情況下,這種刪除方法效率很高。