Подтвердить что ты не робот

SQL UPDATE TOP с ORDER BY?

У меня есть следующий запрос:

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

В таблице сообщений есть столбец приоритетов, и я хочу сначала выбрать сообщения с высоким приоритетом. Так что мне нужно заказать. Но мне не нужно сортировать вывод, но сортировать данные перед запуском обновления.

Насколько я знаю, невозможно добавить ORDER BY в оператор UPDATE. Есть еще идеи?

4b9b3361

Ответ 1

для этого можно использовать общее выражение таблицы:

;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, например обновляемое представление.

Ответ 2

Вы можете попробовать sub-запрос, например

  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.*

Ответ 3

правильный синтаксис обновления -

UPDATE [LOW_PRIORITY] [IGNORE] table_reference
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ...
[WHERE where_condition]
[ORDER BY ...]
[LIMIT row_count]