Как обновить и заказать с помощью MS SQL
-
19-08-2019 - |
Вопрос
В идеале я хочу сделать это:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
На английском языке: я хочу получить 10 лучших (статус = 0) сообщений из БД и заблокировать их (статус = 10). Сначала должно быть получено сообщение с более высоким приоритетом.
к сожалению, MS SQL не разрешает указывать порядок по предложениям в обновлении.
В любом случае, как это обойти?
Решение
Вы можете выполнить подзапрос, в котором сначала получите идентификаторы 10 лучших, упорядоченных по приоритету, а затем обновите те, которые находятся в этом подзапросе:
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
Вы также можете сделать подзапрос настолько сложным, насколько захотите - объединение нескольких таблиц и т. д.
Почему это лучше? Он не зависит от наличия поля идентификатора (или любого другого уникального столбца) в таблице 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- нас / библиотека / 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)