在只有一两列重复的情况下,如何从postgres表中删除重复的数据?

时间:2019-03-25 16:11:51

标签: sql postgresql duplicates

我有一个表,其中一两列中有重复的数据。我想删除重复的数据并仅保留一条记录。

我尝试了以下代码,但是它删除了表中的所有数据。

DELETE from test del 
WHERE EXISTS (
        SELECT *
        FROM test ex
        WHERE ex.name= del.name      
        );

2 个答案:

答案 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
        );