如何通过使用MS SQL以更新和
-
19-08-2019 - |
题
理想我想这样做:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
在英国:我想要得到的前10可用的(状态= 0)从DB消息并将其锁定(状态= 10)。具有较高优先级的消息应首先得到。
不幸的是MS SQL不因在更新子句允许的顺序。
反正如何绕过这个?
解决方案
您可以做一个子查询,你第一次得到的前10名,按优先顺序的ID,然后更新是在该子查询中的:
UPDATE messages
SET status=10
WHERE ID in (SELECT TOP (10) Id
FROM Table
WHERE status=0
ORDER BY priority DESC);
其他提示
WITH q AS
(
SELECT TOP 10 *
FROM messages
WHERE status = 0
ORDER BY
priority DESC
)
UPDATE q
SET status = 10
我要提供这是一个更好的方法 - 你并不总是有标识字段的奢侈品:
UPDATE m
SET [status]=10
FROM (
Select TOP (10) *
FROM messages
WHERE [status]=0
ORDER BY [priority] DESC
) m
您还可以使子查询中那样复杂,只要你想 - 加入多个表,等等...
这是为什么好?它不依赖于身份字段的messages
表的存在(或任何其他唯一列)。它可以用于从任何表更新顶部N行,即使该表中有在全部没有唯一键。
UPDATE messages SET
status=10
WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);
正如下面的评论说,你也可以使用SET ROWCOUNT条款,但只为SQL Server 2014和较旧的。
SET ROWCOUNT 10
UPDATE messages
SET status = 10
WHERE status = 0
SET ROWCOUNT 0
更多信息: http://msdn.microsoft.com/en-我们/库/ ms188774.aspx
或者与一个临时表
DECLARE @t TABLE (id INT)
INSERT @t (id)
SELECT TOP 10 id
FROM messages
WHERE status = 0
ORDER BY priority DESC
UPDATE messages
SET status = 10
WHERE id IN (SELECT id FROM @t)
不隶属于 StackOverflow