如何从oracle中删除表中的最近(日期)记录?

时间:2014-06-16 14:11:21

标签: oracle

我想从我的表中删除最近的最近记录。

选择最后一条记录的代码:

SELECT * FROM 
( select ID, NAME, 
createdon
 from Person where age= 30 
order by createdon DESC) 
WHERE ROWNUM <= 1;

我试过这个删除最后的记录:

DELETE * FROM 
( select ID, NAME, 
createdon
 from Person where age= 30 
order by createdon DESC) 
WHERE ROWNUM <= 1;

它无法正常工作。 错误:&#34;表名无效&#34;

请帮助,谢谢

1 个答案:

答案 0 :(得分:1)

正如OracleUser所说,您无法从内嵌视图中删除。您可以使用原始内部查询根据它选择的所有三列进行删除,假设它们将唯一标识一行:

delete from person
where (id, name, createdon) = (
  select * from (
    select id, name, createdon
    from person
    where age = 30 
    order by createdon desc
  ) 
  where rownum <= 1
);

SQL Fiddle

如果ID是主键或唯一键,则可以执行此操作:

delete from person
where id =
(
  select id
  from (
    select id, row_number() over (order by createdon desc) as rn
    from person where age = 30
  )
  where rn = 1
);

如果不是,那么您可以使用rowid代替,在语句中替换id的两个引用。

最里面的查询与select中的内部查询基本相同,但我使用row_number分析函数来指定等效的rownum。根据{{​​1}}计算,下一个图层会过滤除最新图层以外的所有内容。

您可以使用row_number代替,但可以获得两次完全相同的记录,并且需要决定是否应该删除两者,或者是否应该有其他方法来打破平局 - 例如rank()。正如我在此处所示,order by createdon desc, id desc也可以任意打破领带,但可以有明确的额外排序来控制它,就像row_number()一样。而且还有rownum

SQL Fiddle

这有点简单,但如果您有多个具有相同dense_rank()值的行,也会删除多行:

createdon