在所有记录都重复的postgres中删除重复的记录

时间:2019-04-01 15:02:12

标签: postgresql

我的postgres表模型具有完全重复的记录,我需要编写一个查询来删除它们。

id |型号| model_id | dependent_on_model

----- + ------- + ---------- + --------------------

1 |卡72 |公制
   1 |卡72 |公制
   2 |卡79 |公制
   2 |卡79 |公制
   3 |卡83 |公制
   3 |卡83 |公制
   5 |卡86 |公制

使用Cte没有帮助,因为我遇到了错误 关系“ cte”不存在。

请提出一个删除重复行的查询,最后我将只有4条不同的记录。

1 个答案:

答案 0 :(得分:1)

我的建议是将表复制到TEMPORARY TABLE WITH OIDS中。这样,您就可以使用其他一些ID来区分两个相同的行。

想法:

  1. 在临时表中将数据与另一个ID复制。
  2. 删除临时表中的重复项。
  3. 删除实际表
  4. 将数据从临时表复制回实际表中。
  5. 删除TEMPORARY TABLE

您必须在实际表上执行一些破坏性的操作,因此在从实际表中删除任何内容之前,请确保您的TEMPORARY TABLE有想要保留的内容。

这就是创建TEMPORARY TABLE的方式:

CREATE TEMPORARY TABLE dups_with_oids
( id        integer
, model     text
, model_id  integer
, dependent_on_model text
) WITH OIDS;

这是DELETE查询:

WITH temp AS
(
  SELECT  d.id AS keep
          , d.oid AS keep_oid
          , d2.id AS del
          , d2.oid AS del_oid
  FROM dups_with_oids d
    JOIN dups_with_oids d2 ON (d.id = d2.id AND d.oid < d2.oid)
) 
DELETE FROM dups_with_oids d
WHERE d.oid IN (SELECT temp.del_oid FROM temp);

SQLFiddle来证明理论。

我应该补充一点,如果idPRIMARY KEYUNIQUE,则不可能有这些重复项。