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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top