2010-07-30 3 views
1

В любой момент я хочу, чтобы в моей таблице отображались последние 20 строк и удалялось все остальное. Я попробовал rownum> 20, но он сказал, что «0 строк удалено», даже когда у моего стола было 50 записей. Однако на triying rownum < 20 - первые 19 записей были удалены. Пожалуйста, помогите.Чтобы удалить записи за пределами 20 из таблицы

+0

Когда вы произносите delete, вы имеете в виду, «если они не отображаются в результате», или вы действительно хотите удалить их из базовой таблицы? –

ответ

0

ROWNUM - псевдо-столбец, которому присваивается 1 для первой строки, созданной запросом, 2 для следующего и т. Д. Если вы скажете «WHERE 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.

Смежные вопросы