मैं sql सर्वर में शीर्ष 100 रिकॉर्ड कैसे अपडेट कर सकता हूं


393

मैं SQL सर्वर में शीर्ष 100 रिकॉर्ड को अपडेट करना चाहता हूं। मेरे पास T1खेतों के साथ एक मेज है F1और F2T1200 रिकॉर्ड है। मैं F1शीर्ष 100 रिकॉर्ड में क्षेत्र को अपडेट करना चाहता हूं । मैं TOP 100SQL सर्वर के आधार पर कैसे अपडेट कर सकता हूं ?

जवाबों:


684

ध्यान दें, अद्यतन विवरण के लिए कोष्ठक आवश्यक हैं:

update top (100) table1 set field1 = 1

28
किसी भी विचार कैसे के order byरूप में अच्छी तरह से उपयोग करने के लिए ?
जो फिलिप्स

8
@JoePhilllips ऑर्डर के लिए मार्टिन स्मिथ जवाब का उपयोग करें
jjxtra

हालांकि, ये शीर्ष 100 रिकॉर्ड नहीं हैं, लेकिन केवल 100 मनमाने ढंग से चुने गए रिकॉर्ड हैं। शीर्ष 100 में रिकॉर्ड दर्ज करने के लिए कुछ आदेश शामिल होंगे।
थोरस्टन केटनर

1
यह प्रश्न "जैसा कि पूछा गया" का उत्तर देता है लेकिन TOP कुछ ORDER के बिना अर्थहीन (और अप्रत्याशित) है। मार्टिन स्मिथ द्वारा उत्तर को और नीचे देखें।
एंडी जी

1
btw: लघुकोष्ठक महत्वपूर्ण हैं!
साइमन_वेअर

300

ORDER BYपूरे विचार के बिना कोई TOPमतलब नहीं है। आपको इस बात की लगातार परिभाषा होनी चाहिए कि कौन सी दिशा "ऊपर" है और जो शीर्ष की अवधारणा के लिए सार्थक है।

फिर भी SQL सर्वर इसे अनुमति देता है लेकिन एक नियतात्मक परिणाम की गारंटी नहीं देता है

UPDATE TOPस्वीकार किए जाते हैं जवाब में वाक्य रचना एक का समर्थन नहीं करता ORDER BYखंड लेकिन इसे यहाँ नीचे के रूप में वांछित सॉर्ट क्रम को परिभाषित करने के लिए एक CTE या व्युत्पन्न तालिका का उपयोग करके नियतात्मक अर्थ विज्ञान पाने के लिए संभव है।

;WITH CTE AS 
( 
SELECT TOP 100 * 
FROM T1 
ORDER BY F2 
) 
UPDATE CTE SET F1='foo'

71
आप व्यर्थ कहते हैं लेकिन यह सच नहीं है। मैं मानता हूँ कि, / आमतौर पर /, जब आप TOPबाधाओं का उपयोग कर रहे हैं, तो आपको इसका उपयोग करना चाहिए ORDER BYक्योंकि आप जिस चीज में रुचि रखते हैं वह किसी चीज के "सबसे" या "कम से कम" की तरह है। हालांकि, अन्य मामलों में, आप केवल एक मिलान रिकॉर्ड प्राप्त करने में रुचि रख सकते हैं। आज मेरी तरह! मुझे एक समय में डेटा मुद्दों (चक्र) को ठीक करने की आवश्यकता थी। संपूर्ण फिक्स प्रक्रिया में एक db स्क्रिप्ट, कुछ उपयोगकर्ता हस्तक्षेप और कुछ एप्लिकेशन ऑपरेशन शामिल थे। हमें ध्यान नहीं था कि कौन सा रिकॉर्ड पहले संभाला गया था। हमने सिर्फ इतना ध्यान दिया कि हम उन्हें एक बार में संभाल रहे थे।
मेटाफाइट

17
@ मीटाफ़ाइट लेकिन तब आपके पास WHEREपहले से संसाधित रिकॉर्ड को बाहर करने के लिए एक खंड होगा । लिखित और स्वीकृत उत्तर के रूप में प्रश्न बहुत ही व्यर्थ है। BTW: एक कतार के रूप में तालिकाओं का उपयोग करने के लिए यह काफी उपयोगी कड़ी है
मार्टिन स्मिथ

10
मुझे बिना आदेश के शीर्ष का उपयोग करने की आवश्यकता है ताकि मैं एक अतुल्यकालिक प्रक्रिया चला सकूं। जहां क्लॉज उन लोगों को शामिल नहीं करेगा जिन्हें पहले ही संसाधित किया जा चुका है, लेकिन मैं एक बार में केवल इतनी प्रक्रिया कर सकता हूं। तो यह एक पूरी तरह से वैध उपयोग मामला है।
जेफ डेविस

4
@ मर्टिन स्मिथ: मान लीजिए कि आप बैचों में अपडेट करना चाहते हैं, एक बार में 10000 बोलें। इसके लिए एक अच्छा उपयोग की तरह लगता है, और आदेश कोई फर्क नहीं पड़ता। यह "समझ में नहीं" कैसे आता है?
जय सुलिवन

5
@ नॉटफेड यह वही मामला है जिस पर ऊपर की टिप्पणियों में मृत्यु के बारे में पहले ही चर्चा की जा चुकी है। उस मामले में आपकी क्वेरी को स्वीकार किए गए उत्तर में एक जैसा नहीं लगेगा? आपको एक whereही पंक्तियों को बार-बार संसाधित करने से बचने के लिए एक खंड की आवश्यकता होगी ।
मार्टिन स्मिथ

14

मेरे जैसे उन लोगों के लिए जो अभी भी SQL Server 2000 से चिपके हुए हैं, क्वेरी SET ROWCOUNT {number};से पहले उपयोग किए जा सकते हैंUPDATE

SET ROWCOUNT 100;
UPDATE Table SET ..;
SET ROWCOUNT 0;

अद्यतन को 100 पंक्तियों तक सीमित कर देगा

यह SQL 2005 के बाद से कम से कम हटा दिया गया है, लेकिन SQL 2017 के रूप में यह अभी भी काम करता है। https://docs.microsoft.com/en-us/sql/t-sql/statements/set-rowcount-transact-sql?view=sql-server-2017


1
सेट रोवर ट्रिगर को प्रभावित करता है और साथ ही साथ कमांड को अपडेट किया जा रहा है। यदि आपके पास कैस्केड डिलीट सेट है, तो चाइल्ड टेबल में चाइल्ड रो की अधिक संख्या मौजूद होने पर यह ट्रांजेक्शन को विफल कर सकता है।
एरिका

इसके साथ ही कहा, SET ROWCOUNT @RowCountParameter; मान्य सिंटैक्स है, जबकि सेलेक्ट टॉप @RowCountParamter * टेबलनेम से अमान्य है। यदि आपको अपडेट की जा रही पंक्तियों को कॉन्फ़िगर करने की आवश्यकता है, तो SET ROWCOUNT # वर्तमान में बेहतर विकल्प है, बशर्ते आपके पास कैस्केड डिलीट सक्षम के साथ चाइल्ड टेबल न हों।
एरिका

SQL Server 2017 में अब TOP क्लॉज में @variable
एलेक्जेंडर ज़ुर्बकिन


4

यहां तक ​​कि कूलर भी तथ्य यह है कि आप एक इनलाइन टेबल-वेल्यूड फंक्शन का उपयोग कर सकते हैं, जिसे TOPअपडेट करने के लिए (और कितने के माध्यम से ) पंक्ति का चयन करें। अर्थात्:

UPDATE MyTable
SET Column1=@Value1
FROM tvfSelectLatestRowOfMyTableMatchingCriteria(@Param1,@Param2,@Param3)

टेबल वैल्यू फंक्शन के लिए आपके पास अपडेट करने के लिए पंक्ति का चयन करने के लिए कुछ दिलचस्प है:

CREATE FUNCTION tvfSelectLatestRowOfMyTableMatchingCriteria
(
    @Param1 INT,
    @Param2 INT,
    @Param3 INT
)
RETURNS TABLE AS RETURN
(
    SELECT TOP(1) MyTable.*
    FROM MyTable
    JOIN MyOtherTable
      ON ...
    JOIN WhoKnowsWhatElse
      ON ...
    WHERE MyTable.SomeColumn=@Param1 AND ...
    ORDER BY MyTable.SomeDate DESC
)

..., और वहां (मेरी विनम्र राय में) केवल शीर्ष चयनित पंक्तियों को नियत रूप से अद्यतन करने की सच्ची शक्ति है, जबकि एक ही समय में UPDATEबयान के वाक्य विन्यास को सरल बनाना है ।



0

तुम भी उपनाम का उपयोग कर चयन से अद्यतन और शामिल हो सकते हैं:

UPDATE  TOP (500) T
SET     T.SomeColumn = 'Value'
FROM    SomeTable T
        INNER JOIN OtherTable O ON O.OtherTableFK = T.SomeTablePK
WHERE   T.SomeOtherColumn = 1
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.