如何使用ms sql来更新和订购
理想情况下,我想这样做:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
用英文:我想从数据库中获得前10个可用(状态= 0)的消息并locking它们(状态= 10)。 应该先获得优先级更高的消息。
不幸的是MS SQL不允许更新中的order by子句。
无论如何如何规避这一点?
你可以做一个子查询,你首先得到按优先级排列的前10名的ID,然后更新子查询中的那些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
您也可以使子查询复杂,只要你想要 – join多个表等等…
为什么这更好? 它不依赖于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-us/library/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)