删除表中N个最旧的条目

时间:2009-04-28 12:23:17

标签: tsql sybase

如何删除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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

我最喜欢Eduardo的选择,因为它是最简单的解决方案,但是由于Sergej提到它很慢,所以这是另一种解决方案:

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

  1. 创建一个与原始表格结构相同的临时表。
  2. 将前N行插入临时表。
  3. 截断原始表格。
  4. 将临时表中的行复制回原始表。
  5. 通常这会更快,特别是如果表中有很多行。

答案 2 :(得分:0)

如果您在id上有聚集索引,则执行delete top查询是安全的。

delete top 2 from TableName;

答案 3 :(得分: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;