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. Есть еще идеи?
Ответы
Ответ 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]