2012-07-19 21 views
14

में विभिन्न मानों के साथ एकाधिक पंक्तियों को अपडेट करें मेरे पास टेबल myTable और कॉलम आईडी, पॉज़एक्स, पॉजि के साथ एक SQLite डेटाबेस है। पंक्तियों की संख्या लगातार बदलती है (बढ़ सकती है या घट सकती है)। यदि मुझे प्रत्येक पंक्ति के लिए आईडी का मान और पंक्तियों की संख्या पता है, तो क्या मैं आईडी के अनुसार अलग-अलग मानों वाले सभी पॉज़एक्स, पॉली फ़ील्ड को अपडेट करने के लिए एक एकल SQL क्वेरी कर सकता हूं?एक एकल SQL क्वेरी

उदाहरण: SQL क्वेरी के लिए

--------------------- 
myTable: 

id posX posY 

1  35  565 
3  89  224 
6  11  456 
14  87  475 
--------------------- 

छद्म कोड:

" UPDATE myTable SET posX[id] = @arrayX[id], posY[id] = @arrayY[id] " 

@arrayX, arrayY सरणियों किया जा रहा है जो posX और कहावत क्षेत्र के लिए नए मूल्यों की दुकान।

अगर, उदाहरण के arrayX और arrayY के लिए निम्न होना मान:

arrayX = { 20, 30, 40, 50 } 
arrayY = { 100, 200, 300, 400 } 

क्वेरी के बाद डेटाबेस इस तरह दिखना चाहिए:

--------------------- 
myTable: 

id posX posY 

1  20  100 
3  30  200 
6  40  300 
14  50  400 
--------------------- 

यह संभव है? मैं अभी प्रति पंक्ति एक पंक्ति अद्यतन कर रहा हूं। लेकिन यह पंक्ति गणना बढ़ने के साथ सैकड़ों प्रश्न लेने जा रहा है। मैं यह सब एआईआर में रास्ते में कर रहा हूं।

+0

हो सकता है कि यह कर सकते हैं सहायता http://dba.stackexchange.com/questions/17590/find-last-max-value-according-to-timestamp-using-update-method – adopilot

उत्तर

18

इस को कुशलता से कुशलतापूर्वक पूरा करने के कुछ तरीके हैं।

पहला -
यदि संभव हो, तो आप अस्थायी तालिका में कुछ प्रकार के थोक सम्मिलित कर सकते हैं। यह आपकी आरडीबीएमएस/मेजबान भाषा पर कुछ हद तक निर्भर करता है, लेकिन सबसे खराब यह एक साधारण गतिशील एसक्यूएल (VALUES() क्लॉज का उपयोग करके) के साथ पूरा किया जा सकता है, और फिर एक मानक अद्यतन-से-एक-टेबल। अधिकांश सिस्टम थोक लोड के लिए उपयोगिता प्रदान करते हैं, हालांकि

दूसरा -
और यह कुछ हद तक आरडीबीएमएस निर्भर है, आप एक गतिशील अद्यतन कथन बना सकते हैं।इस मामले में, जहां CTE अंदर VALUES(...) खंड ऑन-द-मक्खी बना दिया गया है में:

WITH Tmp(id, px, py) AS (VALUES(id1, newsPosX1, newPosY1), 
           (id2, newsPosX2, newPosY2), 
           ......................... , 
           (idN, newsPosXN, newPosYN)) 

UPDATE TableToUpdate SET posX = (SELECT px 
           FROM Tmp 
           WHERE TableToUpdate.id = Tmp.id), 
         posY = (SELECT py 
           FROM Tmp 
           WHERE TableToUpdate.id = Tmp.id) 


WHERE id IN (SELECT id 
      FROM Tmp) 

(प्रलेखन के अनुसार, इस वैध SQLite वाक्य रचना होना चाहिए, लेकिन मैं यह करने के लिए नहीं मिल सकता है एक बेला में काम)

+0

धन्यवाद, मुझे लगता है कि मैं गतिशील बयानों को एक शॉट दूंगा। – astralmaster

+0

क्या आप अपना कोड उत्तर में डाल सकते हैं? अभी अगर वह लिंक मर जाता है, तो आपका जवाब बेकार के बगल में आता है। –

+0

@ जॉर्जस्टॉकर - आह, धन्यवाद। किसी भी तरह से मैंने मूल टैग को याद किया, और मेरा उदाहरण विवरण आरडीबीएमएस लक्ष्य में मान्य नहीं था। उम्मीद है कि यह अब काम करेगा ... –

4

इस तरह आप के लिए काम कर सकते हैं:

"UPDATE myTable SET ... ; 
UPDATE myTable SET ... ; 
UPDATE myTable SET ... ; 
UPDATE myTable SET ... ;" 

posX या कहावत से कोई भी मान ही कर रहे हैं, तो वे एक क्वेरी में जोड़ा जा सकता है

UPDATE myTable SET posX='39' WHERE id IN('2','3','40'); 
+0

आप टेक्स्ट एडिटर में इस तरह के बयान तैयार कर सकते हैं और उन्हें सीधे कमांड लाइन में पेस्ट करें। अगर आपके पास बनाने के लिए बहुत सारे अपडेट नहीं हैं तो अच्छी तरह से काम करता है। – pavitran

14

हाँ, आप कर सकते हैं ऐसा करें, लेकिन मुझे संदेह है कि यह प्रदर्शन में सुधार करेगा, जब तक आपकी क्वेरी में वास्तविक बड़ी विलंबता न हो।

आप कर सकता है: NUM_QUERIES * (COST_QUERY_SETUP + COST_QUERY_PERFORMANCE):

UPDATE table SET posX=CASE 
     WHEN id=id[1] THEN posX[1] 
     WHEN id=id[2] THEN posX[2] 
     ... 
     ELSE posX END, posY = CASE ... END 
WHERE id IN (id[1], id[2], id[3]...); 

कुल लागत कम या ज्यादा द्वारा दिया जाता है। इस तरह, आप NUM_QUERIES पर थोड़ा सा दस्तक देते हैं, लेकिन COST_QUERY_PERFORMANCE बड़े समय तक चला जाता है। यदि COST_QUERY_SETUP वास्तव में बहुत बड़ा है (उदा।, आप कुछ नेटवर्क सेवा को कॉल कर रहे हैं जो वास्तविक धीमी है) तो, हाँ, आप अभी भी शीर्ष पर समाप्त हो सकते हैं।

अन्यथा, मैं आईडी पर अनुक्रमण, या आर्किटेक्चर को संशोधित करने का प्रयास करता हूं।

MySQL में मुझे लगता है कि आप डिप्लिकेट कुंजी अपडेट पर एक से अधिक इंसर्ट के साथ इसे और अधिक आसानी से कर सकते हैं (लेकिन मुझे यकीन नहीं है, कभी कोशिश नहीं की गई)।

+0

अच्छा उदाहरण! दुर्भाग्यवश, जैसा कि मैंने कहा था, पंक्तियों की संख्या बदलने जा रही है, इसलिए "WHEN" ऑपरेटरों की संख्या लगातार बदलनी होगी। – astralmaster

+0

यदि आप वास्तव में ऐसा करने के इच्छुक हैं, तो आप गतिशील रूप से क्वेरी बना सकते हैं। क्वेरी को पांच या छह टुकड़ों में तोड़ दिया गया है, उनमें से तीन (पहला और दूसरा मामला, और आईएन क्लॉज) एक एकल WHILE लूप के अंदर बनाया गया है। यदि आप मान बदलते हैं तो आपको ऐसा कुछ करना चाहिए ... – LSerni

+0

मैं जो कुछ सोच रहा था वह बहुत कुछ है। धन्यवाद। – astralmaster

-9

= "के साथ अद्यतन गोली सेट का प्रयास करें (पंक्ति, 'मान' जहां आईडी = 0001 '), (पंक्ति =' मान 2 'जहां आईडी = 0002'), ...

+1

का समर्थन नहीं करता यह काम नहीं करता है। –

+0

यह क्या है !!! – Mafujul

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