Frage

Im Idealfall das ich tun möchte:

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

In English: Ich mag die Top-10 verfügbar (Status = 0) Nachrichten von der DB bekommen und sperren sie (Status = 10). Eine Nachricht mit einer höheren Priorität soll zuerst geholt werden.

leider MS SQL keine ORDER BY-Klausel in dem Update ermöglichen.

Wie auch immer, wie dies zu umgehen?

War es hilfreich?

Lösung

Sie können eine Unterabfrage tun, wo Sie zuerst nach Priorität die IDs der Top-10 bestellt und dann diejenigen aktualisieren, die auf dieser Sub-Abfrage sind:

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

Andere Tipps

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

Ich habe zu bieten als einen besseren Ansatz - Sie müssen nicht immer den Luxus eines Identitätsfeld haben:

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

Sie können auch die Unterabfrage machen so kompliziert, wie Sie wollen - Verbinden Sie mehrere Tabellen, etc ...

Warum ist das besser? Es verlässt sich nicht auf das Vorhandensein eines Identitätsfeld (oder jede andere Spalte) in der messages Tabelle. Es kann verwendet werden, um die Top-N Zeilen aus einer Tabelle zu aktualisieren, selbst wenn diese Tabelle überhaupt keinen eindeutigen Schlüssel hat.

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

Wie weiter unten in den Kommentaren erwähnt, können Sie auch die SET ROWCOUNT-Klausel verwenden, aber nur für SQL Server 2014 und älter.

SET ROWCOUNT 10

UPDATE messages
SET status = 10 
WHERE status = 0 

SET ROWCOUNT 0

Mehr Infos: http://msdn.microsoft.com/en- us / library / ms188774.aspx

oder mit einer temporären Tabelle

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)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top