2009-08-31 21 views
9

मैं डेटाबेस तालिका में शीर्ष 400 पंक्तियों को अद्यतन करना चाहता हूं। छद्म एसक्यूएल नीचे है, मैं यह कैसे कर सकता हूं?शीर्ष 400 कैसे अपडेट करें?

UPDATE top (400) db.dbo.tbl 
SET column1 = 2 
WHERE column2 = 1 
    AND column1 is null 
+0

सवाल क्या है? – RaYell

+0

मुझे लगता है कि आप एसक्यूएल सर्वर का उपयोग कर रहे हैं। क्या ये सही है? एचएलजीईएम के उत्तर को भी ध्यान दें, इस बात की कोई गारंटी नहीं है कि जब भी आप इसमें कोई ऑर्डर नहीं करेंगे तब तक आपको यह प्रश्न तब तक चलाया जाएगा जब तक आप इस क्वेरी को नहीं चलाते। –

+0

रीटैग किया गया, ऐसा करने के लिए आपको SQL सर्वर का उपयोग करना होगा क्योंकि कोई अन्य लोकप्रिय डीबीएमएस में शीर्ष 400 जैसे स्टेटमेंट – tekiegreg

उत्तर

5

आप शीर्ष 400 कैसे निर्धारित करेंगे? बिना किसी आदेश के कोई गारंटी नहीं है कि एक ही सेट हमेशा चुना जाएगा और इस प्रकार गलत रिकॉर्ड अपडेट किए जा सकते हैं।

9
UPDATE db.dbo.tbl SET column1 = 2 WHERE 
primaryID IN (
    SELECT TOP (400) primarkyID FROM db.dbo.tbl 
    WHERE column2 = 1 AND column1 IS NULL 
) 

लेकिन मुझे यह पसंद नहीं है क्योंकि शीर्ष 400 की गारंटी देने का कोई तरीका नहीं है, तो आप कुछ अन्य प्रकार के मानदंडों को जोड़ना चाहेंगे। और यहां तक ​​कि सबक्वायरी द्वारा एक आदेश भी।

4

आप शायद कुछ इस तरह की तलाश में हैं:

update db.dbo.tbl set column1 = 2 
where ID in (
    select top 400 ID from db.dbo.tbl 
    where column2 = 1 and column1 is null --the criteria have been moved here 
    order by ID --order by clause recommended 
) 

जहां आईडी तालिका के प्राथमिक कुंजी स्तंभ है।

+0

है, आप क्वेरी में 'TOP' का उपयोग करने के बजाय 'set rowcount 400' का उपयोग भी कर सकते हैं http: // msdn .microsoft.com/en-us/library/ms188774.aspx – pjp

+3

सिवाय इसके कि सेट ROWCOUNT बहिष्कृत है। –

+0

@ डेव: क्या आप निश्चित हैं? मैं देख नहीं सकता कि एमएसडीएन दस्तावेज़ों में प्रलेखित http://msdn.microsoft.com/en-us/library/ms188774.aspx – pjp

4

यदि आप SQL Server 2008 का उपयोग कर रहे हैं, तो "शीर्ष एन" वाक्यविन्यास हटाएं और अद्यतन विवरणों पर काम करेगा। अन्यथा, यहां सूचीबद्ध अन्य विधियां जहां आप उपकुंजी या व्युत्पन्न तालिका में प्राथमिक कुंजी की पहचान करते हैं, वे अच्छी तरह से काम करेंगे। और जैसा कि अन्य ने किया है, "ऑर्डर बाय" की अत्यधिक अनुशंसा की जाती है या आपके द्वारा अपडेट की जाने वाली पंक्तियां एक क्वेरी से अगले तक भिन्न हो सकती हैं।

+0

एसक्यूएल 2005 पर भी काम करता है, लेकिन ब्रैकेट की आवश्यकता है: टॉप (एन)। एसक्यूएल 2005 बीओएल, अद्यतन स्टेटमेंट, टॉप() खंड देखें। – Rick

5
WITH q AS 
     (
     SELECT TOP 400 * 
     FROM db.dbo.tb 
     WHERE column2 = 1 
       AND column1 is null 
     ORDER BY 
       column3 -- choose your order! 
     ) 
UPDATE q 
SET  column2 = 2 
+0

@Quassnoi, बस उत्सुक है, उप-चयन के बजाय सीटीई का उपयोग करने का क्या फायदा है? –

+1

'@ jmgant': आप 'ओरेकल', 'अद्यतन (शीर्ष 400 * चुनें ...) सेट में उप-चयन को अपडेट नहीं कर सकते ...' विफल हो जाएगा। दूसरों द्वारा प्रस्तावित एक 'आईएन' स्थिति का परिणाम केवल अतिरिक्त 'जॉइन' होता है जो यहां अनावश्यक है। – Quassnoi

+1

इसके अलावा, यह तब भी काम करेगा जब आपके पास 'प्राथमिक कुंजी' नहीं है या आपके पास 'प्राथमिक कुंजी' है ('SQL सर्वर' में, आप 'IN' predicate में एक से अधिक कॉलम का उपयोग नहीं कर सकते) – Quassnoi

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