【问题标题】:How to remove duplicate records in a table/view in oracle?如何删除oracle中表/视图中的重复记录?
【发布时间】:2011-12-19 00:38:39
【问题描述】:

我在 Oracle 中有一个视图 nat_gas_readings_view,我发现一些重复项不知从何而来。几个月来,直到上周才出现重复的迹象。以下是我从我的视图中收集的一些示例数据。我想写一个查询来删除这个重复项。如果可能的话,任何人都可以解释这是如何发生的,并帮助我创建一个查询以从视图中删除重复项。谢谢你。

DATETIMESTAMP                 BOF            EAF             LEVY           SHOP

10/31/2011 13:00:01     3564729     933776          12459       307
10/31/2011 13:00:01     3564729     933776      12459       307
10/31/2011 12:00:08     3563079     933446          12459       307
10/31/2011 12:00:08     3563079     933446      12459       307
10/31/2011 11:00:09     3561659     933121      12459       307
10/31/2011 11:00:09     3561659     933121      12459       307
10/31/2011 10:00:10     3560636     932802      12458       307
10/31/2011 09:00:08     3559548         932481      12450       307
10/31/2011 09:00:08     3559548     932481      12450       307

【问题讨论】:

  • 您可以发布视图吗?
  • @Dante 如果你有重复的地方应该没有,那么你遇到的问题不仅仅是弄清楚如何删除它们。我建议您彻底分析您的数据模型,看看是否缺少任何键。

标签: oracle duplicate-data duplicate-removal


【解决方案1】:

如果这是一个视图,您需要先查看创建此视图的查询,可能是基础查询中的数据不重复或有更多字段使其不重复。

摆脱重复的一种方法是通过在创建视图的选择中添加 DISTINCT 来更改视图中的查询。

我会在输入时通过检查或创建唯一键来消除重复项。

【讨论】:

    【解决方案2】:

    删除 dups 的最简单方法可能是使用 rowid,例如:

    delete from nat_gas_readings ng1 
    where rowid <> (select max (rowid) from nat_gas_readings ng2
    where ng1.datetimestamp = ng2.datetimestamp
    and ng1.bof = ng2.bof 
    and ng1.eaf = ng2.eaf
    and ng1.levy = ng2.levy
    and ng1.shop = ng2.shop)
    

    但视图不会有 rowid。请发布您的视图定义-也许正是这个创建了重复!如果视图 def 正常,那么可能使用上面的 rowid 从基础表中删除 dups。最好应用一个独特的约束,以确保将来不会发生这种情况。

    【讨论】:

      猜你喜欢
      • 2015-09-27
      • 2019-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-12
      • 2017-02-02
      • 1970-01-01
      相关资源
      最近更新 更多