数据库类型为PostGres 8.3。
如果我写:
SELECT field1, field2, field3, count(*)
FROM table1
GROUP BY field1, field2, field3 having count(*) > 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我找到的唯一答案是http://www.siafoo.net/article/64,但我不知道是否可以不使用散列。
警告我没有一个唯一编号的PK,所以我不能使用min(.)技术。PK是三个字段。
发布于 2008-10-28 14:59:14
这是所有表都应该有主键的原因之一(不一定是ID号或标识,而是一个或多个列的组合,这些列唯一地标识一行并在数据库中强制其唯一性)。
你最好的选择是这样的:
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发布于 2008-10-28 14:58:14
一个可能的答案是:
CREATE <temporary table> (<correct structure for table being cleaned>);
BEGIN WORK; -- if needed
INSERT INTO <temporary table> SELECT DISTINCT * FROM <source table>;
DELETE FROM <source table>
INSERT INTO <source table> SELECT * FROM <temporary table>;
COMMIT WORK; -- needed
DROP <temporary table>;我不确定事务语句是否需要“work”,也不确定在PostgreSQL中是否需要显式BEGIN。但是这个概念适用于任何DBMS。
唯一要注意的是引用约束,特别是触发的删除操作。如果存在这些问题,情况可能就不那么令人满意了。
发布于 2008-10-28 15:00:57
这将使用OID对象ID (如果表是用它创建的):
DELETE FROM table1
WHERE OID NOT IN (SELECT MIN (OID)
FROM table1
GROUP BY field1, field2, field3)https://stackoverflow.com/questions/243567
复制相似问题