如何删除N个最旧的条目。我是有限的Sybase。我需要编写一个存储过程,它接受一个数字X,然后在表中只留下X个最新的条目。
例如: 说ID是自动递增的。它越小,此条目越旧。
ID Text
=========
1 ASD
2 DSA
3 HJK
4 OIU
我需要一个像这样执行的程序。
execute CleanUp 2
,结果将是
ID Text
=========
3 HJK
4 OIU
答案 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提到它很慢,所以这是另一种解决方案:
创建执行以下操作的存储过程:
通常这会更快,特别是如果表中有很多行。
答案 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;