开发者社区> 问答> 正文

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和16万个条目的索引,这将花费很长时间。尝试过考虑可以解决此问题的联接,但到目前为止仍找不到好的解决方案。

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

小修改:我们这里没有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之外,其他所有内容都是相同的。

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

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-18 17:04:00 401 0
1 条回答
写回答
取消 提交回答
  • 您可以通过联接而不是子查询来获得答案

    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决定反对索引,请确保适当的人员了解其索引策略,而不是您编写使速度变慢的查询的方式。

    2019-11-18 17:04:09
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
SQL Server 2017 立即下载
GeoMesa on Spark SQL 立即下载
原生SQL on Hadoop引擎- Apache HAWQ 2.x最新技术解密malili 立即下载