Удалить записи за пределами 20 из таблицы - PullRequest
1 голос
/ 30 июля 2010

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

1 Ответ

0 голосов
/ 30 июля 2010

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...