我想使用自己的更新特定值执行更新某些外部表的foreach行,并强制它使用外部表中的行作为CountToUpdate更新前(n)行。
UPDATE TOP(q.CountToUpdate) dbo.TableName SET SomeId = NULL
FROM @Quantities q
WHERE TableName.Status = 960 AND TableName.SomeId = q.SomeId;
是否可以以这种方式更新,还是应该将其重写为其他内容?
db on sql server 2012,谢谢
答案 0 :(得分:1)
我会使用row_number()
和join
:
UPDATE t
SET SomeId = NULL
FROM (SELECT t.*, ROW_NUMBER() OVER (PARTITION BY t.SomeId ORDER BY t.SomeId) as seqnum
FROM dbo.TableName t
WHERE t.Status = 960
) t JOIN
@Quantities q
ON q.SomeId = ie.SomeId;
答案 1 :(得分:1)
TOP
不确定,在使用TOP(n)
时,n
必须是外部参考。您可以使用CROSS APPLY
执行更新,TOP
允许使用UPDATE t
SET SomeID = NULL
FROM @Quantities AS q
CROSS APPLY
( SELECT TOP (q.CountToUpdate) t.ID, t.SomeID, t.Status
FROM dbo.TableName AS t
WHERE t.SomeID = q.SomeID
AND t.Status = 960
ORDER BY t.ID
) AS t;
和确定性订单:
DECLARE @T TABLE (ID INT IDENTITY, SomeID INT, Status INT);
DECLARE @Q TABLE (SomeID INT, CountToUpdate INT);
INSERT @T (SomeID, Status)
VALUES
(1, 960), (1, 960), (1, 960), (1, 960), (1, 960),
(2, 960), (2, 960), (2, 960), (2, 960), (2, 960),
(3, 960), (3, 960), (3, 960), (3, 960), (3, 960);
INSERT @Q (SomeID, CountToUpdate)
VALUES (1, 4), (2, 3), (3, 2);
UPDATE t
SET SomeID = NULL
FROM @q AS q
CROSS APPLY
( SELECT TOP (q.CountToUpdate) t.ID, t.SomeID, t.Status
FROM @T AS t
WHERE t.SomeID = q.SomeID
AND t.Status = 960
ORDER BY t.ID
) AS t;
SELECT *
FROM @t;
完整的工作示例:
{{1}}