我想从我的表中删除最近的最近记录。
选择最后一条记录的代码:
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;
请帮助,谢谢
答案 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
);
如果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
。
这有点简单,但如果您有多个具有相同dense_rank()
值的行,也会删除多行:
createdon