ROWNUM
- псевдостолбец, которому присваивается 1 для первой строки, созданной запросом, 2 для следующей и т. Д. Если вы скажете «ГДЕ ROWNUM> 20», ни одна строка не будет сопоставлена - первая строка, если она была, будет иметь ROWNUM = 1, но ваш предикат заставляет его отклонить ее - поэтому запрос не возвращает строк.
Если вы хотите запросить только последние 20 строк, вам потребуется какой-то способ определить, в каком порядке они были вставлены в таблицу. Например, если каждая строка получает временную метку при вставке, это обычно будет достаточно надежно (если только вы не вставляете тысячи строк каждую секунду).
Например, для таблицы с определением MYTABLE (ts TIMESTAMP, mycol NUMBER) можно запросить последние 20 строк с помощью запроса, подобного следующему:
SELECT * FROM (
SELECT ts, mycol FROM MYTABLE ORDER BY ts DESC
)
WHERE ROWNUM <= 20;
Обратите внимание, что если существует более одной строки с одинаковой отметкой времени, этот запрос может выбрать некоторые строки недетерминированно, если две или более строк связаны с 20-м местом.
Если у вас есть индекс на ts
, он, вероятно, будет использовать индекс, чтобы избежать сортировки, и Oracle будет использовать оптимизацию с помощью клавиши остановки, чтобы остановить запрос, как только будет найдена 20-я строка.
Если вы хотите удалить более старые строки, вы можете сделать что-то вроде этого, предполагая, что mycol
уникален:
DELETE MYTABLE
WHERE mycol NOT IN (
SELECT mycol FROM (
SELECT ts, mycol FROM MYTABLE ORDER BY ts DESC
)
WHERE ROWNUM <= 20
);
Производительность этого удаления, если количество удаляемых строк велико, вероятно, будет зависеть от индекса на mycol.