当前位置: 首页 > 知识库问答 >
问题:

如何在PostgreSQL中查找重复记录

弘涛
2023-03-14

我有一个名为“user_links”的PostgreSQL数据库表,该表当前允许以下重复字段:

year, user_id, sid, cid

唯一约束当前是第一个名为“id”的字段,但是我现在希望添加一个约束,以确保年份用户idsidcid都是唯一的,但我无法应用约束,因为已经存在违反此约束的重复值。

有没有找到所有重复的方法?

共有3个答案

冯敏达
2023-03-14

为了简化,我假设您希望仅对列year应用唯一约束,并且主键是名为id的列。

为了找到你应该运行的重复值,

SELECT year, COUNT(id)
FROM YOUR_TABLE
GROUP BY year
HAVING COUNT(id) > 1
ORDER BY COUNT(id);

使用上面的sql语句可以得到一个表,其中包含表中所有重复的年份。为了删除除最新的重复项之外的所有重复项,您应该使用上面的sql语句。

DELETE
FROM YOUR_TABLE A USING YOUR_TABLE_AGAIN B
WHERE A.year=B.year AND A.id<B.id;
曹浩淼
2023-03-14

从“使用PostgreSQL查找重复行”中可以看到以下智能解决方案:

select * from (
  SELECT id,
  ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id asc) AS Row
  FROM tbl
) dups
where 
dups.Row > 1
仰英发
2023-03-14

基本思路是使用带有计数聚合的嵌套查询:

select * from yourTable ou
where (select count(*) from yourTable inr
where inr.sid = ou.sid) > 1

您可以调整内部查询中的where子句以缩小搜索范围。

对于评论中提到的问题,还有另一个很好的解决方案(但不是每个人都读):

select Column1, Column2, count(*)
from yourTable
group by Column1, Column2
HAVING count(*) > 1

或更短:

SELECT (yourTable.*)::text, count(*)
FROM yourTable
GROUP BY yourTable.*
HAVING count(*) > 1
 类似资料:
  • 问题内容: 我想在MySQL数据库中提取重复记录。这可以通过以下方式完成: 结果是: 我想将其拉出,以使其显示重复的每一行。就像是: 关于如何做到这一点有什么想法?我试图避免做第一个,然后在代码中用第二个查询查找重复项。 问题答案: 关键是重写此查询,以便可以将其用作子查询。

  • 我们有一个包含以下各栏的照片表: 此表包含组合的重复值。因此,一行可能会出现多次。 删除这些重复的最好方法是什么?(我用的是PostgreSQL 9.2和Rails 3。)

  • 在Mongo shell中,我将如何过滤今天(或特定日期)添加的记录?我没有新记录时间戳的特定字段,但我想它可以从ObjectID恢复。

  • 如何插入双引号 2.创建要插入该表的存储过程。 3.使用此查询插入的数据: 它的作品!!! 4.以下组合全部失败。当双引号变成单引号时,反之亦然 如何使用存储过程插入上述数据??

  • 在类内部,我如何找到泛型类中传递的是什么类类型。例如,在上面,我想找到Integer被传递。

  • 问题内容: 如何在java中查找String中的重复字符? 问题答案: 创建一个 HashMap ,字符串的字符将作为键插入,其计数作为值插入。 如果 HashMap 已经包含字符,则将其计数加 1,否则将字符放入 HashMap。 如果 Char 的值大于 1,则表示它是该 String 中的重复字符。 Java程序在字符串中查找重复字符 当你运行上面的程序时,你会得到以下输出: