Удалить N самых старых записей в таблице - PullRequest
2 голосов
/ 28 апреля 2009

Как удалить 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 ]

3 голосов
/ 28 апреля 2009

Примечание: синтаксис 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 голос
/ 29 апреля 2009

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

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

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

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

0 голосов
/ 31 марта 2017

Я знаю, что это старый вопрос, но это можно сделать, не создавая утверждение как верхний ответ, используя 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;
0 голосов
/ 07 июля 2009

Если у вас есть кластеризованный индекс по идентификатору, можно выполнить запрос delete top .

delete top 2 from TableName;
...