31

次のクエリがあります。

UPDATE TOP (@MaxRecords) Messages 
SET    status = 'P' 
OUTPUT inserted.* 
FROM   Messages 
where Status = 'N'
and InsertDate >= GETDATE()

メッセージ テーブルには優先度の列があり、最初に優先度の高いメッセージを選択したいと考えています。だから私はORDER BYが必要です。ただし、出力をソートする必要はありませんが、更新を実行する前にデータをソートする必要があります。

私の知る限り、ORDER BY を UPDATE ステートメントに追加することはできません。他のアイデアはありますか?

4

3 に答える 3

46

これには共通のテーブル式を使用できます。

;with cte as (
   select top (@MaxRecords)
       status
   from Messages 
   where Status = 'N' and InsertDate >= getdate()
   order by ...
)
update cte set
    status = 'P'
output inserted.*

これは、SQL Server では更新可能なビューのように cte を更新できるという事実を利用しています。

于 2013-10-25T08:05:27.760 に答える
18

次のようなサブクエリを試すことができます

  UPDATE Messages 
    SET    status = 'P' 
    WHERE MessageId IN (SELECT TOP (@MaxRecords) MessageId FROM Messages where Status = 'N' and InsertDate >= GETDATE() ORDER BY Priority)
output inserted.*
于 2013-10-25T08:04:50.870 に答える
-9

update の正しい構文は次のとおりです。

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]
于 2013-10-25T08:03:43.230 に答える