0

愚蠢的问题和答案可能不存在(喘气!呻吟!咬牙切齿!牙齿!)

我有一个选择:

SELECT * FROM SockDrawer WHERE Color = 'red'

这会产生 3 行,行 ID 分别为 33896、35901、37903(还有很多其他结果。)

我想要的是这样的:

DECLARE @ROWID INT --- HOW DO I USE ARRAYS? I'll google but an example would help.
DECLARE @COUNT INT
DECLARE @LIMIT INT

SELECT * FROM SockDrawer WHERE Color = 'red' 
--(Returns 3 rows. With 3 RowId's 33896, 35901, 33896)

SET @LIMIT = @@ROWCOUNT

SET @COUNT = 1
WHILE @COUNT < @LIMIT BEGIN
  SET @ROWID[0] = (SELECT SockKey From SockDrawer WHERE RowID = 33896)
  SET @ROWID[1] = (SELECT SockKey From SockDrawer WHERE RowID = 35901)
  SET @ROWID[2] = (SELECT SockKey From SockDrawer WHERE RowID = 33896)
  SET @Count = @Count + 1
 END
GO

Then I need to:


SET @COUNT = 0
WHILE @COUNT < @LIMIT 
    BEGIN
        DELETE FROM SockDrawer WHERE RowID = @ROWID[@COUNT]
    END
GO

诀窍是我永远不知道我是在处理要删除的 1 行还是 50 行。

我是一个白痴。我可以改变。如果我想。

4

1 回答 1

1

如果您不关心每种颜色的袜子,那么:

;WITH x AS 
(
  SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY Color ORDER BY RowID)
    FROM dbo.SockDrawer
)
DELETE x WHERE rn > 1;

如果您关心保留哪一个,请ORDER BY相应地进行调整。

于 2013-07-24T19:56:10.657 回答