一尘不染

从表中删除重复项

sql

数据库类型为PostGres 8.3。

如果我写了:

SELECT field1, field2, field3, count(*) 
FROM table1
GROUP BY field1, field2, field3 having count(*) > 1;

我有一些计数超过1的行。如何取出重复的行(我仍然希望每个行都保留1行,而不是+1行…我不想删除所有行。)

例子:

1-2-3
1-2-3
1-2-3
2-3-4
4-5-6

应该变成:

1-2-3
2-3-4
4-5-6

我找到的唯一答案是 在那里,但是我想知道是否可以在没有哈希列的情况下做到这一点。

警告 我没有具有唯一编号的PK,因此无法使用min(…)技术。PK是3个字段。


阅读 208

收藏
2021-03-10

共1个答案

一尘不染

这是所有表都应具有主键的众多原因之一(不一定是ID号或IDENTITY,而是一个或多个可唯一标识行并且在数据库中具有其唯一性的列的组合)。

您最好的选择是这样的:

SELECT field1, field2, field3, count(*) 
INTO temp_table1
FROM table1
GROUP BY field1, field2, field3 having count(*) > 1

DELETE T1
FROM table1 T1
INNER JOIN (SELECT field1, field2, field3
      FROM table1
      GROUP BY field1, field2, field3 having count(*) > 1) SQ ON
            SQ.field1 = T1.field1 AND
            SQ.field2 = T1.field2 AND
            SQ.field3 = T1.field3

INSERT INTO table1 (field1, field2, field3)
SELECT field1, field2, field3
FROM temp_table1

DROP TABLE temp_table1
2021-03-10