正如你可能知道你可以在以後的版本中使用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