【问题标题】:How to delete duplicate data from postgres table, while only one or two columns have duplicates?如何从 postgres 表中删除重复数据,而只有一两列有重复?
【发布时间】:2019-03-26 01:29:45
【问题描述】:
我有一个表,其中一列或两列中有重复数据。我想删除重复数据并只保留一条记录。
我尝试了以下代码,但它从我的表中删除了所有数据。
DELETE from test del
WHERE EXISTS (
SELECT *
FROM test ex
WHERE ex.name= del.name
);
【问题讨论】:
标签:
sql
postgresql
duplicates
【解决方案1】:
如果没有主键,区分重复行的技巧是使用ctid,即标识行的(非持久)物理位置的伪列。
两行不能有相同的ctid,ctid 可以相互比较。
以下查询为每个重复添加了条件,以区分要删除的行和要保留的行。
DELETE from test del
WHERE EXISTS (
SELECT *
FROM test ex
WHERE ex.name= del.name
AND ex.ctid > del.ctid
);
【解决方案2】:
如果你的数据有主键,那么你可以这样做:
delete from test t
where t.pk in (select min(t2.pk) from test t2 group by t2.name);