【问题标题】:Delete duplicate data and keep the latest record using Oracle SQL not working使用 Oracle SQL 删除重复数据并保留最新记录不起作用
【发布时间】:2020-10-08 07:34:56
【问题描述】:

我有VK_MODIFY 表,我想通过ORDERIDEXTORID 的组合删除所有重复数据,并只保留最新的SYSTEM_INSERTED_AT

[![在此处输入图片描述][1]][1]

我已尝试以下查询,但它无法正常工作:

DELETE FROM VK_MODIFY a
WHERE rowid not in
(SELECT min(rowid)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);

【问题讨论】:

  • 无法正常工作怎么办?它错误或删除了错误的行?
  • 它实际上删除了错误的行...例如,在示例中,我想检查 ORDERID 和 EXTORDID 的每个相同组合并获取最新的 system_inserted_at 日期并删除其他行...例如这里它应该保留 ORDERID = 197179, EXTORDID = 9821732, SYSTEM_inserted_at = '2019-10-18 18.01.59' 并删除 ORDERID = 197179, EXTORDID = 9821732 的其他行
  • orderid 是如何生成的?如果这是来自序列,那么它将是一个我可以发布的简单查询。如果较新记录的 orderid 大于旧记录,则不需要根据 system_inserted_at 进行排序
  • 不,orderid 没有序列...它在此表中从 gui 生成随机数
  • 好的,我已经发布了可以解决您问题的答案

标签: sql oracle duplicates sql-delete


【解决方案1】:

这是另一个可以解决您的问题的示例。

 DELETE FROM VK_MODIFY WHERE ROWID IN(SELECT TEMP.ROWID FROM(
SELECT ROWID,ORDERID, EXTORID, SYSTEM_INSERTED_AT,
ROW_NUMBER()OVER (PARTITION BY ORDERID,EXTORID ORDER BY SYSTEM_INSERTED_AT DESC) RN  FROM VK_MODIFY
)TEMP
WHERE TEMP.RN <> 1)

最佳做法是您的表中应该有一个主键字段,如果有,您可以使用该字段代替 rowid。

【讨论】:

  • 如果例如 SYSTEM_INSERTED_AT 具有与示例中给出的日期和时间相同的行,您可以看到具有 SYSTEM_INSERTED_AT 的重复行具有 2020-06-18 09:29:28... 这会工作吗?
  • 在这种情况下你想做什么,要么删除两者,要么使用表中的其他列进行一些其他检查。
  • 你可以试试这个例子,似乎它也能涵盖这一点
  • 在这种情况下,它应该只保留一行并删除其他具有相同 SYSTEM_INSERTED_AT 的行
  • 是的,它适用于这种情况,只有当您有超过 2 个重复项时,您才需要多次运行此查询
【解决方案2】:

试试这个:

DELETE FROM VK_MODIFY a
WHERE SYSTEM_INSERTED_AT not in
(SELECT max(SYSTEM_INSERTED_AT)
FROM VK_MODIFY b
where a.ORDERID = b.ORDERID and a.EXTORID = b.EXTORID);

根据您的架构(索引、...),可能会有更快的解决方案。

【讨论】:

  • 如果例如 SYSTEM_INSERTED_AT 具有与示例中给出的日期和时间相同的行,您可以看到具有 SYSTEM_INSERTED_AT 的重复行具有 2020-06-18 09:29:28... 这会工作吗?
  • 如果有多行具有相同的orderid、extorid和system_inserted_at,你如何决定保留哪一个?
  • 此表中有字段 FILENAME,在这种情况下必须不同..但此活动只能执行一次
  • 那么只需在文件名上添加一个条件,因为您没有指定选择哪一个。
  • 实际上我不想添加 FILENAME 条件这就是为什么我没有指定因为 FILENAME 在这里并不重要所以我们可以删除它们...最重要的是 ORDERID 和 EXTORID 的组合并只保留一行对于与最新的 SYSTEM_INSERTED_AT 的这种组合...
猜你喜欢
  • 2019-12-20
  • 1970-01-01
  • 2020-07-05
  • 2017-02-12
  • 2015-09-27
  • 2021-03-18
  • 1970-01-01
  • 2021-11-16
  • 1970-01-01
相关资源
最近更新 更多