كيفية تحديث والنظام باستخدام MS SQL
-
19-08-2019 - |
سؤال
ومن الناحية المثالية أريد أن أفعل هذا:
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)