2

如何删除 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

4 回答 4

3

注意: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
于 2009-04-28T12:33:17.143 回答
1

我最喜欢 Eduardo 的选项,因为它是最简单的解决方案,但由于 Sergej 提到它很慢,这里有一个替代解决方案:

创建执行以下操作的存储过程:

  1. 创建一个与原始表结构相同的临时表。
  2. 将前 N 行插入临时表。
  3. 截断原始表。
  4. 将临时表中的行复制回原始表。

通常这会快得多,特别是如果表中有很多行。

于 2009-04-29T13:03:09.950 回答
0

如果您在 id 上有一个聚集索引,则执行删除顶部查询是安全的。

delete top 2 from TableName;
于 2009-07-07T07:02:47.943 回答
0

我知道这是一个老问题,但这可以在不使用 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;
于 2017-03-31T13:05:58.710 回答