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

year, user_id, sid, cid

唯一约束目前是第一个名为"id"的字段,但我现在想添加一个约束,以确保yearuser_idsidcid都是唯一的,但我无法应用该约束,因为已经存在违反该约束的重复值.

有没有办法找到所有的副本?

推荐答案

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

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

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


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

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

Sql相关问答推荐

从2个表中查找每条记录的唯一最接近的日期匹配

仅在特定字符串之后提取两个圆括号之间的计量单位文本

两个不同星期的销售额,不加成一行

Oracle 23c ROUND,数据类型为DATE

PATINDEX中与[A-Z]匹配(U除外)的正则表达式

在SQL中转换差异表的多列

SQL中相同表内的VLOOKUP等价

将SQL Server查询改进为;线程安全;

每个分组最多 Select 最后 2 个值并并排显示它们

如何向 mariadb 添加外键?

SQL 搜索 - 获取最大值日期的奇怪行为

PostgreSQL-用第一个非空填充以前的值

按公司和产品查询最近发票的平均价格的SQL查询

SQL 按 id 运行总计并受条件限制(在窗口上)

为重复的项目编号显示正在处理

使用 GROUP BY 时如何创建其他组?

SQL Server 分区和 Run Case 语句

如何在 PL/SQL 中区分返回的 XML 值?

SQL/Postgres:按日期和其他属性对相关性能进行分组

SQL:有没有办法根据另一列的数据细节过滤和形成另一列?