Como atualizar e ordem usando o MS SQL
-
19-08-2019 - |
Pergunta
Idealmente, eu quero fazer isso:
UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;
Em Inglês: Eu quero obter o top 10 (= 0 status) mensagens disponíveis a partir do DB e bloqueá-los (status = 10). Uma mensagem com uma prioridade mais alta deve ser obtido em primeiro lugar.
Infelizmente MS SQL não permite que uma cláusula ORDER BY na atualização.
De qualquer forma como contornar isso?
Solução
Você pode fazer uma subconsulta onde você primeiro obter os IDs do top 10 ordenados por prioridade e, em seguida, atualizar os que estão nessa sub consulta:
UPDATE messages
SET status=10
WHERE ID in (SELECT TOP (10) Id
FROM Table
WHERE status=0
ORDER BY priority DESC);
Outras dicas
WITH q AS
(
SELECT TOP 10 *
FROM messages
WHERE status = 0
ORDER BY
priority DESC
)
UPDATE q
SET status = 10
Eu tenho que oferecer isso como uma abordagem melhor - você nem sempre tem o luxo de um campo de identidade:
UPDATE m
SET [status]=10
FROM (
Select TOP (10) *
FROM messages
WHERE [status]=0
ORDER BY [priority] DESC
) m
Você também pode fazer a sub-consulta tão complicado como você quer - juntar várias tabelas, etc ...
Por que isso é melhor? Ele não confia na presença de um campo de identidade (ou qualquer outro única coluna) na tabela de messages
. Ele pode ser usado para atualizar o topo N linhas de qualquer tabela, mesmo que a tabela não tem uma chave única em tudo.
UPDATE messages SET
status=10
WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);
Como afirmado nos comentários abaixo, você também pode usar a cláusula ROWCOUNT SET, mas apenas para SQL Server 2014 e mais velhos.
SET ROWCOUNT 10
UPDATE messages
SET status = 10
WHERE status = 0
SET ROWCOUNT 0
Mais informações: http://msdn.microsoft.com/en- us / library / ms188774.aspx
Ou com uma tabela temporária
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)