Oracle10g 从表中删除超过20条记录的步骤

Oracle10g 从表中删除超过20条记录的步骤,oracle10g,Oracle10g,在任何时候,我都希望我的表显示最近的20行,并删除其余的行。 我尝试了rownum>20,但它说即使我的表有50条记录,也会删除0行。但是,在三次运算时,rownumrownum是一个伪列,它为查询生成的第一行指定1,为下一行指定2,依此类推。如果您说其中ROWNUM>20,则不会匹配任何行-如果有第一行,则ROWNUM=1,但您的谓词会导致它拒绝它-因此查询不会返回任何行 如果只想查询最近的20行,则需要某种方法来确定它们插入表中的顺序。例如,如果每一行在插入时都有一个时间戳,这通常是非常可靠

在任何时候,我都希望我的表显示最近的20行,并删除其余的行。 我尝试了rownum>20,但它说即使我的表有50条记录,也会删除0行。但是,在三次运算时,rownumrownum是一个伪列,它为查询生成的第一行指定1,为下一行指定2,依此类推。如果您说其中ROWNUM>20,则不会匹配任何行-如果有第一行,则ROWNUM=1,但您的谓词会导致它拒绝它-因此查询不会返回任何行

如果只想查询最近的20行,则需要某种方法来确定它们插入表中的顺序。例如,如果每一行在插入时都有一个时间戳,这通常是非常可靠的,除非每秒插入数千行

例如,对于定义为MYTABLEts TIMESTAMP、Mycl NUMBER的表,您可以使用如下查询方式查询最近的20行:

SELECT * FROM (
    SELECT ts, mycol FROM MYTABLE ORDER BY ts DESC
)
WHERE ROWNUM <= 20;

如果要删除的行数很大,则此删除的性能可能会受到mycl上的索引的帮助。

当您说“删除”时,您的意思是,它们不会出现在结果中,还是确实要从基础表中删除它们?
DELETE MYTABLE
WHERE mycol NOT IN (
    SELECT mycol FROM (
        SELECT ts, mycol FROM MYTABLE ORDER BY ts DESC
    )
    WHERE ROWNUM <= 20
);