【问题标题】:Remove duplicate rows in a table删除表中的重复行
【发布时间】:2017-02-08 05:07:39
【问题描述】:

我有一个表格,其中包含如下订单信息:

订单表

从该表中我们可以看出,每个 order_no 都有多个重复项。所以我想要的是每个 order_no 只保留一行(不管是哪一行)

有人知道怎么做吗? (仅供参考,我使用的是 Oracle 10)

【问题讨论】:

  • 请不要张贴代码/表格的图片。将其直接粘贴到您的问题中(请使用正确的格式)。另外,请分享您的尝试。
  • @CodeDecode:这不是重复的。 SQL Server 解决方案不适用于 Oracle。

标签: sql oracle duplicates


【解决方案1】:

这应该可以工作,即使在您的古老和过时的 Oracle 版本中:

delete from order_table
where rowid not in  (select min(rowid)
                     from order_table
                     group by order_no);

【讨论】:

  • 感谢您的回答。对不起,我没有澄清,订单表不是一个实际的表,它只是我查询结果的截图。因此,当我运行您的查询时,它会显示一条错误消息。那么有没有什么办法可以让每个 order_no 只选择一行而不是删除其他行呢?
  • 你得到的错误是什么?如果您未能向我们显示正确的表名和列名,那么您必须自己将我的示例转换为正确的名称。
  • 我认为她/他的意思是,他/她不需要从基表中删除任何内容。相反,他/她想知道如何在结果集中只包含每个 order_no 的一行(不管是哪一行)。
  • @mathguy:问题是“删除重复行”。
  • 我知道。我的托福(英语作为外语考试)成绩非常高,当我到达美国时,如果我的生活依赖于它,我仍然不会说正确的英语。我正在根据她/他在您的答案下方评论的内容进行解释。 “......为每个......只选择一行......”和“截图不是表格,它来自我的查询结果”。所以她/他想从查询结果中“删除”,而不是从一个或多个基表中“删除”。
【解决方案2】:

如果您不在乎每个 order_no 获得哪一行,也许最简单的解决方案(在 Oracle 12 之前)是:

select [whatever columns you want, probably not rn - see below]
from ( select order_table.*,
              row_number() over (partition by order_no order by null) as rn
     )
where rn = 1
;

【讨论】:

    【解决方案3】:

    这是一个查询,通过不同的字段删除具有精确顺序的半重复项:

    delete from message_part
    where ts >= since and ts < since + 1
        and rowid not in (
            select distinct first_value(rowid) over (partition by id order by differing_field)
            from message_part where ts >= since and ts < since + 1
        );
    

    学分转到@a_horse_with_no_name 和Oracle equivalent of Postgres' DISTINCT ON?

    【讨论】:

      猜你喜欢
      • 2012-10-21
      • 2023-04-10
      • 1970-01-01
      • 1970-01-01
      • 2020-03-29
      • 1970-01-01
      相关资源
      最近更新 更多