【问题标题】: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,即标识行的(非持久)物理位置的伪列。 两行不能有相同的ctidctid 可以相互比较。

以下查询为每个重复添加了条件,以区分要删除的行和要保留的行。

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

    【讨论】:

      猜你喜欢
      • 2016-04-09
      • 2011-10-09
      • 1970-01-01
      • 2018-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多