检测哪个字段导致重复
Posted
技术标签:
【中文标题】检测哪个字段导致重复【英文标题】:Detect which field is causing duplicates 【发布时间】: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)
,您将不得不考虑该怎么做。第一个想法是识别重复的ID
s - 这是相当微不足道的......
谢谢@MarmiteBomber,就是这样,我正在尝试编写一个查询,它将向我显示所有导致重复行的字段(=列)并找到它们的 ID。这对我来说不是微不足道的,因为我对这种操作有点陌生。一旦我确定了错误定义的字段或列,我就可以找到重复的功能(业务)原因并解决。理想情况下,我希望有一个查询可以一次检查所有列,但这是可选的
【参考方案1】:
在我看来,应该强制执行主键,并且(pk_field, other_field)
上应该有一个唯一索引。此外,other_field
应该是 NOT NULL
(这样您就不会对相同的 pk_field
产生“重复”,而是为空的 other_field
。
这样做,数据库将自己处理您的问题。
如果你想自己做,那么你能做什么?一个看法?第三方系统?你对整个过程有什么样的控制?如果你能做的就是找到“重复”,那就有点太晚了。
【讨论】:
感谢您的回复。事实上,这并不是很清楚:我正忙于定义视图应该如何。这是分析阶段。 PK 和索引将在该过程的稍后阶段实施。目前,我知道我得到了重复的行,我想找出在我的查询中错误定义了哪一列,以便我可以调整该列的功能定义以匹配 PK 的粒度。我在这样做时遇到了麻烦以上是关于检测哪个字段导致重复的主要内容,如果未能解决你的问题,请参考以下文章