MS SQLを使用して更新および注文する方法
-
19-08-2019 - |
質問
理想的にはこれを行いたい:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
英語:DBから利用可能な上位10件(status = 0)のメッセージを取得し、それらをロック(status = 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
これをより良いアプローチとして提供する必要があります-必ずしもIDフィールドの豪華さがあるわけではありません:
UPDATE m
SET [status]=10
FROM (
Select TOP (10) *
FROM messages
WHERE [status]=0
ORDER BY [priority] DESC
) m
サブクエリを必要なだけ複雑にすることもできます-複数のテーブルを結合するなど...
なぜこれが良いのですか? messages
テーブル内のIDフィールド(またはその他の一意の列)の存在に依存しません。テーブルに一意のキーがまったくない場合でも、任意のテーブルの上位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)
所属していません StackOverflow