PostgreSQL重复多列条目

16

我有一堆数据存储在PostgreSQL数据库中。我认为应该有两个键形成一个唯一的对,因此希望在数据库中执行此操作。我尝试

create unique index key1_key2_idx on table(key1,key2)

但是尝试失败了,告诉我有重复的条目。

我该如何找到这些重复的条目以便删除它们呢?

3个回答

28
select key1,key2,count(*)
from table
group by key1,key2
having count(*) > 1
order by 3 desc;

确定重复项的关键查询部分是having count(*) > 1

以下链接包含许多巧妙的技巧,包括一些删除重复项的示例:http://postgres.cz/wiki/PostgreSQL_SQL_Tricks


请注意,该维基上的一些信息已经非常过时了。当它说Pg的某些行为方式或您不能做某件事时,请务必与官方文档进行双重检查。 - Craig Ringer
1
我不认为这个答案是准确的。这将导致您丢失原始数据,而不仅仅是重复项。例如,如果您有两个相同列集的条目,则此选择将匹配/删除它们两个 - 而不仅仅是重复项。当然,您会满足约束条件 - 但您也刚刚丢失了有效数据(任何具有多个副本的条目都将完全丢失)。 - rocksfrow

12
假设您只想删除重复项并保留原始记录,那么接受的答案是不准确的--它会同时删除您的原始记录,并仅保留从一开始就只有一个条目的记录。这适用于9.x版本:
SELECT * FROM tblname WHERE ctid IN 
(SELECT ctid FROM 
  (SELECT ctid, ROW_NUMBER() OVER 
    (partition BY col1, col2, col3 ORDER BY ctid) AS rnum 
  FROM tblname) t
WHERE t.rnum > 1);

https://wiki.postgresql.org/wiki/Deleting_duplicates


0
select distinct a.*
from tbl a
inner join tbl b on (
a.id <> b.id
and b.col1 = a.col1
and b.col2 = a.col2
)
order by a.col1 asc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接