【发布时间】:2021-09-04 23:51:28
【问题描述】:
我正在设计一个表格,在测试过程中发现其中一个字段导致重复行(它不应该)。
作为预防措施,我想排除在任何其他字段中可能出现的重复项。我将如何检查我的哪一列导致重复 PK?
直观的方法:
Select
count(*),
pk_field,
other_field1
from
table
group by
pk_field,
other_field
having
count(*) > 1
and count(distinct other_field1) >1;
我想确保如果我运行此查询,它将 100% 排除由 other_field1 引起的重复项(对于每个 PK 值只有一个 other_field1 值)。
额外奖励:是否有一个查询可以直接向我显示哪些字段导致重复行,而无需对表中的每个字段进行一次查询?
非常感谢!
编辑:为清楚起见,不会强制执行 PK,并且该表实际上是第三方系统中的视图
【问题讨论】:
-
如果您按 pk_field AND other_field 分组,
count (distinct other_field)将始终为 1。您是否尝试使用一些示例数据运行查询?您不能将您的表的主键设置为与“其他表”相同,并让您的 DBMS 为您强制执行唯一性吗? -
如果 PK 不是唯一的,则它不是主键。 (以及如何执行 PK?)
-
样本数据和期望的结果会有所帮助。您的代码永远不会返回任何行。
-
重复不是由fileds引起的,而是由rows引起的。看来如果你遇到两行有
(1,A,B,C)和(1,A,B,D),你想责备第四列。但是,如果您看到(1,A,B,C)和(1,A,B,C),您将不得不考虑该怎么做。第一个想法是识别重复的IDs - 这是相当微不足道的...... -
谢谢@MarmiteBomber,就是这样,我正在尝试编写一个查询,它将向我显示所有导致重复行的字段(=列)并找到它们的 ID。这对我来说不是微不足道的,因为我对这种操作有点陌生。一旦我确定了错误定义的字段或列,我就可以找到重复的功能(业务)原因并解决。理想情况下,我希望有一个查询可以一次检查所有列,但这是可选的