在去规范化表上按顺序删除

时间:2017-09-12 11:50:23

标签: oracle sql-delete

我需要在没有任何唯一ID的非规范化表上执行删除操作(首先使用最旧的数据)。我们正在考虑将日期作为参数 在决定最旧的数据时。但是对于每个日期,它们将是600K记录。并且由于表非常大,删除操作将分批完成(Loop with rownum) 我使用了下面的查询,但是这个错误是因为“数据操作操作在此视图上不合法”。但我确信temp是表的对象类型。

delete from (Select A.*,rownum as rn from (select * from temp order by date) A) B where B.rn<10

请让我知道任何其他建议。

感谢Kifinity你的解决方案有效,但现在我很困惑如何使其工作删除大量的记录..我有大约1000万条记录,需要批量删除它们。提前谢谢。

1 个答案:

答案 0 :(得分:2)

在您的陈述中,delete from之后的所有内容都是内联视图。您无法从内联视图中删除;你的陈述必须是delete from TABLE,例如

delete from temp
where rowid in (select rowid as rid
                from (select * from temp order by date)
                where rownum < 10)

编辑:根据要求,这是一个PL / SQL循环的示例。

begin
  loop
    delete from temp
    where rowid in (select rowid as rid
                    from (select * from temp order by date)
                    where rownum < 1000);
    if SQL%ROWCOUNT = 0 then exit; end if;
  end loop;
end;
/