【问题标题】:PostgreSQL how to delete duplicated valuesPostgreSQL如何删除重复值
【发布时间】:2020-01-13 16:30:23
【问题描述】:

我的 Postgres 数据库中有一个表,我忘记插入唯一索引。由于那个索引,我现在有重复的值。如何删除重复的值?我想在字段 translationset_Id 和 key 上添加一个唯一索引。

【问题讨论】:

  • 描述您要删除的值。
  • 为了安全删除refer this
  • 我要删除第 2 条记录、第 4 条记录、第 7 条记录、第 11 条记录和第 13 条记录。 (见图)

标签: sql postgresql duplicates


【解决方案1】:

我想你是在问这个:

DELETE FROM tablename WHERE id IN (SELECT id FROM (SELECT id, ROW_NUMBER() OVER (partition BY column1, column2, column3 ORDER BY id) AS rnum FROM tablename) t WHERE t.rnum > 1);

【讨论】:

  • 这可能并不完全正确。看来分区应该只在translationset_idkey 列上,而不是其他列。
  • 嗯,这就像一个蓝图,你可以按照它来解决你的问题。我主要用它来记住程序。
【解决方案2】:

您似乎只想删除与translationset_id 列重复的记录。在这种情况下,我们可以使用 Postgres 的行号功能来区分重复的行,然后删除那些重复的行。

WITH cte AS
(
    SELECT t.*, ROW_NUMBER() OVER (PARTITION BY translationset_id, key) AS rnum
    FROM yourTable t
)

DELETE FROM yourTable
WHERE translationset_id IN (SELECT translationset_id FROM cte WHERE rnum > 1)

【讨论】:

  • 关键列在哪里? "我已经更新了 prtScr"
【解决方案3】:
delete from mytable
where exists (select 1
              from mytable t2
              where t2.name = mytable.name and
                    t2.address = mytable.address and
                    t2.zip = mytable.zip and
                    t2.ctid > mytable.ctid
             );

【讨论】:

    【解决方案4】:

    我认为最有效的方法如下。

      DELETE  FROM
        table_name a
        USING table_name b
      WHERE
          a.id < b.id and
          a.same_column = b.same_column;
    

    【讨论】:

      猜你喜欢
      • 2022-11-02
      • 2017-02-17
      • 2014-11-11
      • 1970-01-01
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2022-01-12
      相关资源
      最近更新 更多