我的postgres表模型具有完全重复的记录,我需要编写一个查询来删除它们。
id |型号| model_id | dependent_on_model
----- + ------- + ---------- + -------------------- >
1 |卡72 |公制
1 |卡72 |公制
2 |卡79 |公制
2 |卡79 |公制
3 |卡83 |公制
3 |卡83 |公制
5 |卡86 |公制
使用Cte没有帮助,因为我遇到了错误 关系“ cte”不存在。
请提出一个删除重复行的查询,最后我将只有4条不同的记录。
答案 0 :(得分:1)
我的建议是将表复制到TEMPORARY TABLE WITH OIDS
中。这样,您就可以使用其他一些ID来区分两个相同的行。
想法:
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来证明理论。
我应该补充一点,如果id
是PRIMARY KEY
或UNIQUE
,则不可能有这些重复项。