Н удалить старые записи в таблице
Как удалить 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 ответа:
Примечание: синтаксис 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
Мне больше всего нравится вариант Эдуардо, так как это самое простое решение, но поскольку Сергей упоминает, что оно довольно медленное, вот альтернативное решение:
Создайте хранимую процедуру, которая выполняет следующие действия:
- Создайте временную таблицу с той же структурой, что и исходная таблица.
- вставьте верхние N строк во временную таблицу.
- усечь исходную таблицу.
- скопируйте строки из временной таблицы обратно в исходную таблицу.
Вообще это будет много быстрее, особенно если в таблице много строк.
Если у вас есть кластеризованный индекс по 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;