当前位置: 首页 > 面试题库 >

SQL查找重复条目(在组内)

傅雪松
2023-03-14
问题内容

SQL查找重复条目(在组内)

我有一个小问题,我不确定修复它的最佳方法是什么,因为我对数据库(Oracle)本身的访问有限。在我们的“
EVENT”表中,我们大约有16万个条目,每个EVENT都有一个GROUPID,而一个普通条目恰好有5行具有相同的GROUPID。由于一个错误,我们目前有几个重复的条目(重复,所以10行而不是5行,只是一个不同的EVENTID。这可能会更改,因此只是<>
5)。我们需要过滤这些组的所有条目。

由于对数据库的访问受到限制,我们不能使用临时表,也不能向GROUPID列添加索引以使其更快。

我们可以通过此查询获取GROUPID,但是需要第二个查询才能获取所需的数据

select A."GROUPID"
from "EVENT" A
group by A."GROUPID"
having count(A."GROUPID") <> 5

一种解决方案是子选择:

select *
from "EVENT" A
where A."GROUPID" IN (
  select B."GROUPID"
  from "EVENT" B
  group by B."GROUPID"
  having count(B."GROUPID") <> 5
)

如果没有GROUPID和160k条目的索引,这将花费很长时间。尝试过考虑可以解决此问题的联接,但到目前为止仍找不到好的解决方案。

有人可以为此找到一个好的解决方案吗?

小修改:我们这里没有100%的重复项,因为每个条目仍然具有唯一的ID,并且GROUPID也不唯一(这就是为什么我们需要使用“ group
by”的原因)-也许我只是错过了一个简单的解决方案它 :)

关于数据的小例子(我不想删除它,只是找到它)

EVENTID | GROUPID | TYPEID

123456    123       12

123457    123       145

123458    123       2612

123459    123       41

123460    123       238



234567    123       12

234568    123       145

234569    123       2612

234570    123       41

234571    123       238

它具有更多列,例如时间戳记等,但是正如您已经看到的那样,除了EVENTID之外,其他所有内容都是相同的。

我们将更频繁地运行它进行测试,以发现错误并检查是否再次发生。


问题答案:

您可以通过联接而不是子查询来获得答案

select
    a.*
from
    event as a
inner join
    (select groupid
     from event
     group by groupid
     having count(*) <> 5) as b
  on a.groupid = b.groupid

这是从组中的行中获取所有信息的相当普遍的方式。

像您建议的答案和其他响应一样,使用groupid上的索引可以更快地运行。由DBA权衡使查询运行更快的好处与维护另一个索引的成本之间的平衡。

如果DBA决定反对索引,请确保适当的人员了解其索引策略,而不是您编写使速度变慢的查询的方式。



 类似资料:
  • 问题内容: 我有一张很大的桌子,上面有关于用户的以下数据。 我想在ssn等于但名称不等于的表中找到所有可能的重复项 我的尝试是: 问题答案: 在SSN上进行分组应该做到这一点 ~~~~ ..或如果每个ssn有很多行,而只想查找重复的名称) 编辑,糟糕,被误解

  • 我只是想插入一些条目到SQL服务器数据库。但是我需要在插入之前检查一下。关键点在于,该表包含两列和。如果条目与SQL服务器数据库中的条目完全相同,则显示的代码应检查这两列,并防止插入该条目。 这意味着数据表的两列与将要插入的两个条目相同。我检查了论坛,但找不到任何有用的解决方案,我的项目。

  • 问题内容: 人(id,狗) 我怎么找到狗最多的人 我是在正确的轨道上,还是行不通?谢谢参观 问题答案: 这个怎么样? 可能不是最有效的方法,但这将使您的狗数最多的人。如果您只想要其中之一,则可以执行以下操作:

  • 问题内容: 在一个字段中查找重复项很容易: 所以如果我们有一张桌子 该查询将为我们提供John,Sam,Tom,Tom,因为它们都相同。 但是,我想要的是获取具有 和的 重复项。 也就是说,我想获得“ Tom”,“ Tom”。 我需要这个的原因:我犯了一个错误,并允许插入重复项和值。现在,我需要删除/更改重复项,因此我需要先 找到 它们。 问题答案: SELECT name, email, COU

  • 我正试图用Firestore数据库进行分页。有没有一种方法让我找到我的Firestore中的文档数量从我的网站使用Javascript,以便我可以编码我的(prev)和(next)按钮进行相应的分页?

  • 问题内容: 因此,当尝试向字段添加自动增量时,它会出现#1062-键1的重复条目‘1’。我尝试删除主键并重新添加它,效果很好(我认为如果有重复项,那不会吗?) 但是,当我尝试向字段添加自动增量时,会引发错误。它为我提供了一个浏览选项,该选项运行以下SQL: 但是,这将返回一个空结果集。表明没有重复项。因此,如果没有重复项,为什么不能添加自动增量? 问题答案: 您是否有任何具有值的行或该列的行?可能