如何删除 N 个最旧的条目。我是有限的Sybase。我需要编写一个接受数字 X 的存储过程,然后在表中只留下 X 个最新条目。
例如:说 ID 是自动递增的。它越小,这个条目越旧。
ID Text
=========
1 ASD
2 DSA
3 HJK
4 OIU
我需要一个像这样执行的程序。
execute CleanUp 2
结果将是
ID Text
=========
3 HJK
4 OIU
注意: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
我最喜欢 Eduardo 的选项,因为它是最简单的解决方案,但由于 Sergej 提到它很慢,这里有一个替代解决方案:
创建执行以下操作的存储过程:
通常这会快得多,特别是如果表中有很多行。
如果您在 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;