2013-10-25 8 views
17

मैं एक निम्न क्वेरी है:एसक्यूएल अद्यतन के साथ शीर्ष अद्यतन?

UPDATE TOP (@MaxRecords) Messages 
SET status = 'P' 
OUTPUT inserted.* 
FROM Messages 
where Status = 'N' 
and InsertDate >= GETDATE() 

संदेश तालिका में प्राथमिकता स्तंभ है और मैं पहली बार उच्च प्राथमिकता संदेशों seleci करना चाहते हैं। तो मुझे एक आदेश की आवश्यकता है। लेकिन मुझे आउटपुट सॉर्ट करने की आवश्यकता नहीं है लेकिन अपडेट रन से पहले डेटा सॉर्ट किया गया है।

जहां तक ​​मुझे पता है कि अद्यतन विवरण में ऑर्डर जोड़ना संभव नहीं है। कोई अन्य विचार?

मीटर।

;with cte as (
    select top (@MaxRecords) 
     status 
    from Messages 
    where Status = 'N' and InsertDate >= getdate() 
    order by ... 
) 
update cte set 
    status = 'P' 
output inserted.* 

यह एक का उपयोग करता है:

+1

[SQL अद्यतन शीर्ष 1 पंक्ति क्वेरी] का संभावित डुप्लिकेट (http://stackoverflow.com/questions/3860975/sql-update-top1-row-query) – fabriciorissetto

+0

संभावित डुप्लिकेट [एमएस एसक्यूएल का उपयोग करके अपडेट और ऑर्डर कैसे करें ] (http://stackoverflow.com/questions/655010/how-to-update-and-order-by-using-ms-sql) – Athafoud

उत्तर

27

उप क्वेरी कोशिश कर सकते हैं तो आप इस के लिए आम तालिका अभिव्यक्ति का उपयोग कर सकते है तथ्य यह है कि SQL सर्वर में अद्यतन करने योग्य दृश्य की तरह सीटी अपडेट करना संभव है।

-6

अद्यतन की सही सिंटैक्स

UPDATE [LOW_PRIORITY] [IGNORE] table_reference 
SET col_name1={expr1|DEFAULT} [, col_name2={expr2|DEFAULT}] ... 
[WHERE where_condition] 
[ORDER BY ...] 
[LIMIT row_count] 
+0

एसक्यूएल सर्वर में नहीं। – mark

12

आप की तरह

UPDATE Messages 
    SET status = 'P' 
    WHERE MessageId IN (SELECT TOP (@MaxRecords) MessageId FROM Messages where Status = 'N' and InsertDate >= GETDATE() ORDER BY Priority) 
output inserted.* 
+0

मेरे मामले में मैं TOP का उपयोग नहीं कर रहा था क्योंकि मैं WHERE क्लॉज द्वारा सभी मिलान किए गए रिकॉर्ड्स को अपडेट करना चाहता था और मुझे त्रुटि मिली: "खंड द्वारा ऑर्डर दृश्य, इनलाइन फ़ंक्शंस, व्युत्पन्न तालिकाओं, सबक्वायरीज़ और सामान्य तालिका अभिव्यक्तियों में अमान्य है , जब तक टॉप, ऑफसेट या एक्सएमएल के लिए भी निर्दिष्ट नहीं किया जाता है। " एक डमी टॉप (100000) जोड़ना इसे काम करता है। मुझे नहीं पता कि मेरे मामले में एक बेहतर समाधान है या नहीं। –

+2

@AugustoBarreto आप एक डमी नंबर के बजाय सभी रिकॉर्ड लेने के लिए 'शीर्ष 100 प्रतिशत' का उपयोग कर सकते हैं। – Athafoud

+0

धन्यवाद! मुझे यह नहीं पता था। दस्तावेज़ों को पढ़ना: "क्वेरी परिणाम में पंक्तियों की सीमा निर्दिष्ट पंक्तियों या पंक्तियों के प्रतिशत पर सेट की गई है" –

संबंधित मुद्दे