正如你可能知道你可以在以后的版本中使用row_number
非常简单地做到这一点。
delete t from
(select ROW_NUMBER() over (order by data) r from table1) t
where r in (2,5,6)
即使没有,有可能使用无证%%LOCKRES%%
功能2点相同的行
SELECT data,%%LOCKRES%%
FROM dbo.table1`
区分,我不认为这是在SQL Server 2000中提供,但。
在SQL集没有顺序,但游标这样做,你可以使用类似下面的东西。注:我期望能够使用DELETE ... WHERE CURRENT OF
,但依赖于PK,所以删除行的代码并不像我期望的那么简单。
如果要删除的数据是重复的,则不能保证它将删除与CURRENT OF
相同的行。然而,在这种情况下,绑定行的排序无论如何都是任意的,因此无论哪一行都被删除,可能同样很好地被赋予了游标排序中的行号。
DECLARE @RowsToDelete TABLE
(
rowidx INT PRIMARY KEY
)
INSERT INTO @RowsToDelete SELECT 2 UNION SELECT 5 UNION SELECT 6
DECLARE @PrevRowIdx int
DECLARE @CurrentRowIdx int
DECLARE @Offset int
SET @CurrentRowIdx = 1
DECLARE @data int
DECLARE ordered_cursor SCROLL CURSOR FOR
SELECT data
FROM dbo.table1
ORDER BY data
OPEN ordered_cursor
FETCH NEXT FROM ordered_cursor INTO @data
WHILE EXISTS(SELECT * FROM @RowsToDelete)
BEGIN
SET @PrevRowIdx = @CurrentRowIdx
SET @CurrentRowIdx = (SELECT TOP 1 rowidx FROM @RowsToDelete ORDER BY rowidx)
SET @Offset = @CurrentRowIdx - @PrevRowIdx
DELETE FROM @RowsToDelete WHERE rowidx = @CurrentRowIdx
FETCH RELATIVE @Offset FROM ordered_cursor INTO @data
/*Can't use DELETE ... WHERE CURRENT OF as here that requires a PK*/
SET ROWCOUNT 1
DELETE FROM dbo.table1 WHERE ([email protected] OR data IS NULL OR @data IS NULL)
SET ROWCOUNT 0
END
CLOSE ordered_cursor
DEALLOCATE ordered_cursor
你的数据库模式不可能是这样的。正如@米奇小麦所说 - 请尽量提供你真实的情景,否则你的生活会变得比他们的生活更困难。 – RPM1984 2011-01-07 04:36:19
*如果它没有主键,它不是一张桌子!*(Joe Celko) - 添加一个主键,所有问题都会自动消失...... – 2011-01-07 07:45:04