【问题标题】:Delete duplicate rows from oracle DB with one condition使用一个条件从 oracle DB 中删除重复行
【发布时间】:2017-07-25 06:44:07
【问题描述】:

我的脚本是正确的,但删除 11320860 条记录的执行时间约为 5 分钟。是否有其他方法可以编写此查询以减少执行时间?

场景是相同的记录组合可以有 E 和 A 记录。如果同一组合至少存在一个 E 记录,则代码会尝试删除 A 和 E 记录。

Delete from tableA u 
WHERE EXISTS
    (Select 1 from tableA w 
    WHERE w.a = u.a
    AND w.b = u.b
    AND w.c = u.c
    AND w.d = u.d
    AND w.flag ='E' ); - Del about 11320860 records in 4 Mins

【问题讨论】:

  • 为什么不干脆做,delete from tableA where flag = 'E'; 你的查询会有不必要的开销
  • 可以使用合并
  • 场景是相同的记录组合可以有E和A记录。如果同一组合至少存在一个 E 记录,则代码会尝试删除 A 和 E 记录。

标签: sql oracle sql-delete dml


【解决方案1】:

所以你需要这个,我想:

Delete from tableA u 
WHERE u.flag in ('A', 'E')
  and EXISTS
    (Select 1 from tableA w 
      WHERE w.a = u.a
        AND w.b = u.b
        AND w.c = u.c
        AND w.d = u.d
        AND w.flag ='E')

这种方式也应该可行:

delete from tableA 
  where flag in ('A', 'E')
    and (a, b, c, d) in 
    (select a, b, c, d 
       from tableA 
      where flag = 'E')

【讨论】:

  • 我添加了一个场景,其中相同的记录组合可以有 E 和 A 记录。如果同一组合至少存在一个 E 记录,则代码会尝试删除 A 和 E 记录。
猜你喜欢
  • 1970-01-01
  • 2017-11-23
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多