سؤال

ومن الناحية المثالية أريد أن أفعل هذا:

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

في اللغة الإنجليزية: I ترغب في الحصول على أفضل 10 المتاحة (الحالة = 0) الرسائل من DB واحبسهم (الحالة = 10). يجب أن تكون حصلت على رسالة مع أولوية أعلى أولا.

للأسف MS SQL لا يسمح جملة ORDER BY في التحديث.

وعلى أي حال كيفية الالتفاف على هذا؟

هل كانت مفيدة؟

المحلول

ويمكنك القيام استعلام فرعي حيث تحصل على أول معرفات من أكبر 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);

وكما ورد في التعليقات أدناه، يمكنك أيضا استخدام شرط ROWCOUNT SET، ولكن فقط ل 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top