PostgreSQL刪除表中重複資料
一、測試資料建立
postgres=# create table test_chongfu(id int not null default null,name char(50) default null,class int default null); CREATE TABLE postgres=# insert into test_chongfu values(1,'AA',1); INSERT 0 1 postgres=# insert into test_chongfu values(2,'AB',8); INSERT 0 1 postgres=# insert into test_chongfu values(3,'AB',8); INSERT 0 1 postgres=# insert into test_chongfu values(4,'BB',5); INSERT 0 1 postgres=# insert into test_chongfu values(5,'BD',7); INSERT 0 1 postgres=# insert into test_chongfu values(6,'BD',7); INSERT 0 1 postgres=# select * from test_chongfu; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 3 | AB | 8 4 | BB | 5 5 | BD | 7 6 | BD | 7 (6 rows) postgres=# alter table test_chongfu add constraint pk1 primary key ("id"); ALTER TABLE postgres=# \d test_chongfu Table "public.test_chongfu" Column | Type | Collation | Nullable | Default --------+---------------+-----------+----------+-------------- id | integer | | not null | name | character(50) | | | NULL::bpchar class | integer | | | Indexes: "pk1" PRIMARY KEY, btree (id)
二、存在唯一標識情況
如果刪除重複資料的表裡有除ctid外的唯一標識,可以利用這一列,我這裡為id列。
postgres=# select * from test_chongfu; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 3 | AB | 8 4 | BB | 5 5 | BD | 7 6 | BD | 7 (6 rows) postgres=# select * from test_chongfu where id not in (select min(id) from test_chongfu group by name,class); id | name | class ----+----------------------------------------------------+------- 3 | AB | 8 6 | BD | 7 (2 rows)
透過id列,檢視根據name和class兩列匹配的重複列。執行如下語句刪除重複資料。
postgres=# delete from test_chongfu where id not in (select min(id) from test_chongfu group by name,class); DELETE 2 postgres=# select * from test_chongfu; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 4 | BB | 5 5 | BD | 7 (4 rows)
三、不存在唯一標識情況
恢復初始測試環境。如果表裡不存在唯一標識列,可以透過ctid來進行。ctid類似於oracle的rowid,但是形式不同。
postgres=# select * from test_chongfu; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 3 | AB | 8 4 | BB | 5 5 | BD | 7 6 | BD | 7 (6 rows) postgres=# select * from test_chongfu where ctid not in( select min(ctid) from test_chongfu group by name,class); id | name | class ----+----------------------------------------------------+------- 3 | AB | 8 6 | BD | 7 (2 rows) postgres=# delete from test_chongfu where ctid not in( select min(ctid) from test_chongfu group by name,class); DELETE 2 postgres=# select * from test_chongfu; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 4 | BB | 5 5 | BD | 7 (4 rows)
四、not in最佳化
in本來效率就很低,not in的效率更加低,如果資料量很大的情況,可能執行時間會特別長。因此可以嘗試把查詢到的唯一資料重新插入到一張新表裡,然後把原來舊錶刪掉,最後修改去重資料後的新表名為舊錶名。
postgres=# create table tab_new as select * from test_chongfu where ctid in(select min(ctid) from test_chongfu group by name,class); SELECT 4 postgres=# select * from tab_new; id | name | class ----+----------------------------------------------------+------- 1 | AA | 1 2 | AB | 8 4 | BB | 5 5 | BD | 7 (4 rows)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69990629/viewspace-2853046/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 解析postgresql 刪除重複資料案例SQL
- mysql 刪除表中重複的資料MySql
- Oracle中刪除表中的重複資料Oracle
- sqlserver中刪除重複資料SQLServer
- 刪除重複資料
- mongodb刪除重複資料MongoDB
- 使用Java Stream API中DistinctBy刪除重複資料JavaAPI
- MS SQL Server 刪除重複行資料SQLServer
- excel刪除重複資料保留一條 如何刪掉重複資料只留一條Excel
- PostgreSQL表增加/刪除欄位是否會重寫表SQL
- JavaScript刪除字串中重複字元JavaScript字串字元
- ORACLE批量刪除無主鍵重複資料Oracle
- Oracle如何刪除表中重複記錄保留第一條Oracle
- 事件溯源投影模式:重複資料刪除策略 - domaincentric事件模式AI
- mysql 刪除重複項MySql
- 刪除oracle重複值Oracle
- JavaScript 刪除重複字元JavaScript字元
- 【常用方法推薦】如何刪除MySQL的重複資料?MySql
- 刪除排序陣列中的重複項排序陣列
- MySQL資料庫中刪除重複記錄的方法總結[推薦]MySql資料庫
- MySQL刪除資料表MySql
- oracle刪除重資料方法Oracle
- VSCode刪除重複的空行VSCode
- JavaScript 刪除字串重複字元JavaScript字串字元
- PostgreSQL:資料庫的建立與刪除SQL資料庫
- C# 批次刪除Excel中的重複行C#Excel
- ES6刪除字串中重複的元素字串
- 刪除有序陣列中的重複項 II陣列
- 刪除字串中的所有相鄰重複項字串
- python 刪除大表資料Python
- JavaScript陣列刪除重複元素JavaScript陣列
- JavaScript 刪除陣列重複元素JavaScript陣列
- Remove Duplicate Letters 刪除重複元素REM
- 刪除重複id的記錄
- c#刪除有序陣列中的重複項C#陣列
- 題目:刪除排序陣列中的重複項排序陣列
- 0026-刪除有序陣列中的重複項陣列
- 牛客(刪除連結串列中重複節點)