我有一个表,其中一两列中有重复的数据。我想删除重复的数据并仅保留一条记录。
我尝试了以下代码,但是它删除了表中的所有数据。
DELETE from test del
WHERE EXISTS (
SELECT *
FROM test ex
WHERE ex.name= del.name
);
答案 0 :(得分:0)
如果您的数据具有主键,则可以执行以下操作:
delete from test t
where t.pk in (select min(t2.pk) from test t2 group by t2.name);
答案 1 :(得分:0)
如果没有主键,则区分重复行的技巧是使用ctid
,它是标识行(非持久)物理位置的伪列。
两行不能具有相同的ctid
,并且ctid
可以相互比较。
以下查询为每个重复项添加条件以区分要删除的行和要保留的行。
DELETE from test del
WHERE EXISTS (
SELECT *
FROM test ex
WHERE ex.name= del.name
AND ex.ctid > del.ctid
);