Question

Idéalement, je veux faire ceci:

UPDATE TOP (10) messages SET status=10 WHERE status=0 ORDER BY priority DESC;

En anglais: je souhaite obtenir les 10 principaux messages disponibles (statut = 0) de la base de données et les verrouiller (statut = 10). Un message avec une priorité plus élevée doit être reçu en premier.

Malheureusement, MS SQL n'autorise pas la clause order by dans la mise à jour.

Quoi qu'il en soit, comment contourner cela?

Était-ce utile?

La solution

Vous pouvez créer une sous-requête dans laquelle vous commencez par obtenir les ID des 10 meilleurs classés par ordre de priorité, puis mettez à jour ceux qui figurent dans cette sous-requête:

UPDATE  messages 
SET status=10 
WHERE ID in (SELECT TOP (10) Id 
             FROM Table 
             WHERE status=0 
             ORDER BY priority DESC);

Autres conseils

WITH    q AS
        (
        SELECT  TOP 10 *
        FROM    messages
        WHERE   status = 0
        ORDER BY
                priority DESC
        )
UPDATE  q
SET     status = 10

Je dois proposer ceci comme une meilleure approche - vous n’avez pas toujours le luxe d’un champ d’identité:

UPDATE m
SET [status]=10
FROM (
  Select TOP (10) *
  FROM messages
  WHERE [status]=0
  ORDER BY [priority] DESC
) m

Vous pouvez également rendre la sous-requête aussi compliquée que vous le souhaitez - en joignant plusieurs tables, etc. ...

Pourquoi est-ce mieux? Il ne repose pas sur la présence d'un champ d'identité (ou de toute autre colonne unique) dans la table messages . Il peut être utilisé pour mettre à jour les N premières lignes d'une table, même si cette table n'a pas de clé unique.

UPDATE messages SET 
 status=10 
WHERE ID in (SELECT TOP (10) Id FROM Table WHERE status=0 ORDER BY priority DESC);

Comme indiqué dans les commentaires ci-dessous, vous pouvez également utiliser la clause SET ROWCOUNT, mais uniquement pour SQL Server 2014 et les versions antérieures.

SET ROWCOUNT 10

UPDATE messages
SET status = 10 
WHERE status = 0 

SET ROWCOUNT 0

Plus d'infos: http://msdn.microsoft.com/en- us / library / ms188774.aspx

Ou avec une table temporaire

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)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top