mydb=> select * from test_name; id | name ----+-------- 1 | francs 1 | francs 1 | francs 2 | fpZhou 2 | fpZhou 3 | A 4 | B 5 | C (8 rows)
删除重复数据
查询重复数据情况
1 2 3 4 5 6
mydb=> select distinct id ,count(*) from test_name group by id having count(*) > 1; id | count ----+------- 1 | 3 2 | 2 (2 rows)
备注:上面查询出 id 为1 的记录有 3条, id 为 2的记录有两条。
查询重复的数据(即将删除的数据)
1 2 3 4 5 6 7 8 9
mydb=> select * from test_name a where a.ctid notin (select min(ctid) from test_name b group by id); id | name ----+-------- 1 | francs 1 | francs 2 | fpZhou (3 rows)
备注:上面查询列出重复的数据(即将删除的数据)。
1 2 3 4 5 6 7 8 9 10 11 12 13
mydb=> select ctid,* from test_name where name='francs'; ctid | id | name -------+----+-------- (0,1) | 1 | francs (0,2) | 1 | francs (0,3) | 1 | francs (3 rows)
mydb=> select min(ctid) from test_name where name='francs'; min ------- (0,1) (1 row)
删除重复的数据
1 2 3
mydb=> delete from test_name a mydb-> where a.ctid notin (select min(ctid) from test_name b group by id); DELETE 3
查询验证
1 2 3 4 5 6 7 8 9
mydb=> select * from test_name order by id; id | name ----+-------- 1 | francs 2 | fpZhou 3 | A 4 | B 5 | C (5 rows)
上述实验是通过表记录的 tid 来进行去重的,也可以根据业务需要,对表上的字段进行分析做为去重字段。
嵌套SQL删除重复数据
也可以使用以下SQL 删除重复数据
1 2 3 4 5 6
deletefrom test_name a where a.ctid <> ( selectmax(b.ctid) from test_name b where a.id = b.id );