Н удалить старые записи в таблице


Как удалить N самых старых записей. Я ограничен Sybase. Мне нужно написать хранимую процедуру, которая приняла бы число X, а затем оставила бы только X самых новых записей в таблице.

Например: Скажем, ID автоматически увеличивается. Чем она меньше, тем старше эта запись.

ID  Text
=========
1   ASD
2   DSA
3   HJK
4   OIU
Мне нужна процедура, которая была бы выполнена вот так.
execute CleanUp 2

И результат будет

ID  Text
=========
3   HJK
4   OIU
4 2

4 ответа:

Примечание: синтаксис SQL Server, но должен работать

Delete from TableName where ID in 
    (select top N ID from TableName order by ID )

Если вы хотите, чтобы N был параметром, вам придется построить строку оператора и выполнить ее

declare @query varchar(4000)
set @query = 'Delete from TableName where ID in '
set @query = @query + '(select top ' + @N + ' ID from TableName order by ID )'
exec sp_executesql @query

Мне больше всего нравится вариант Эдуардо, так как это самое простое решение, но поскольку Сергей упоминает, что оно довольно медленное, вот альтернативное решение:

Создайте хранимую процедуру, которая выполняет следующие действия:

  1. Создайте временную таблицу с той же структурой, что и исходная таблица.
  2. вставьте верхние N строк во временную таблицу.
  3. усечь исходную таблицу.
  4. скопируйте строки из временной таблицы обратно в исходную таблицу.

Вообще это будет много быстрее, особенно если в таблице много строк.

Если у вас есть кластеризованный индекс по id, можно безопасно выполнить удалить сверху запрос.

delete top 2 from TableName;

Я знаю, что это старый вопрос, но это можно сделать без построения утверждения, как говорят в верхнем ответе, используя CTE:

WITH MyCTE AS
(
    SELECT Field1, Field2, ROW_NUMBER() OVER (ORDER BY Field1 ASC) AS RowNum
    FROM MyTable
    WHERE Field2 = @WhatIWant
)
DELETE FROM MyCTE WHERE RowNum <= @NbRowsToDelete;