2013-07-23 7 views
8

शुभ दिन हर कोई। मैं अपने एसक्यूएल स्टेटमेंट के बारे में एक प्रश्न पूछना चाहता हूं। मैं SQL सर्वर 2008 का उपयोग कर रहा हूं और वर्कफ़्लो लेनदेन नामक एक तालिका है। इस तालिका में, मेरे पास 12 रिकॉर्ड हैं। नीचे दी गई तस्वीर तालिका की सामग्री है।सबक्वायरीज़ का उपयोग करके अद्यतन - आवश्यक रिकॉर्ड्स से अधिक अपडेट

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] IN 
(
    SELECT [RequestId] 
    FROM Workflow_Txn 
    WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
    AND RequestId = 3 
) 

मेरे उद्देश्य ऐसा अनुरोध आईडी है कि अधिकतम से कम की ORDERNUMBER, जो SELECT कथन अंदर से व्यवहृत किया जा सकेगा है अद्यतन करने के लिए है:

enter image description here

मैं इस एसक्यूएल बयान है WHERE खंड। अब मैं उम्मीद करता हूं कि रिकॉर्ड अपडेट किए जाएंगे केवल रिकॉर्ड्स (कोड में, यह अनुरोध आईडी # 3) होगा।

वास्तव में क्या हुआ केवल चार रिकॉर्ड अपडेट होने की बजाय, यह पांच (5) हो गया! क्या मेरे मौजूदा SQL कथन में कोई समस्या है?

उत्तर

6

आपकी समस्या यह है कि आप RequestId = 3. के साथ सभी रिकॉर्ड्स का अद्यतन कर रहे हैं। ध्यान रखें कि आपका सबक्वायरी परिणाम है ताकि आप सभी संबंधित रिकॉर्ड अपडेट कर सकें।

आपकी क्वेरी अगर आप अपने क्वेरी और अधिक जटिल बनाने के लिए की तुलना में यह करने की जरूरत है किसी भी कारण है

UPDATE Workflow_Txn 
SET Status = 1 
WHERE RequestId = 3 

सुनिश्चित नहीं हैं कि बराबर है। मुझे लगता है कि कुछ सरल चाल

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
     AND RequestId = 3 
+0

मुझे लगता है कि तुम क्या पता चला है मुझे मेरा की तुलना में आसान था: क्या मुझे लगता है कि आप देख रहे थे की तरह कुछ था। मैं ऑर्डर नंबर से कम रिकॉर्ड अपडेट करने का लक्ष्य रख रहा हूं, यानी मैं नवीनतम रिकॉर्ड से पहले रिकॉर्ड अपडेट करूँगा। –

+0

@ जू-चान: जहां तक ​​मैं समझता हूं कि मेरी क्वेरी को काम करना चाहिए, क्या आपने इसका परीक्षण किया है? –

6

आपकी क्वेरी के साथ समस्या यह है कि सबक्वेरी आदेश संख्या अधिकतम से कम के साथ रिकॉर्ड को खोजने के लिए काफी विस्तार में चला जाता है करना होगा। और फिर यह एक ही अनुरोध के साथ सबकुछ चुनता है - जिसमें अधिकतम आदेश संख्या शामिल होगी।

मैं इस प्रकार यह एक CTE का उपयोग कर ठीक करने के लिए पसंद करते हैं:

with toupdate as (
     select t.*, 
      MAX(OrderNumber) as MaxON 
     from Workflow_txn 
     where RequestId = 3 
    ) 
UPDATE toupdate 
    SET Status = 1 
    where OrderNumber < MaxON; 

मैं इस संरचना की तरह है, क्योंकि मैं CTE अलग से क्या रिकॉर्ड अपडेट होने की संभावना है को देखने के लिए चला सकते हैं।

आपकी क्वेरी सुलझाने के लिए आपको OrderNumber का उपयोग करने के अनुरोध बदल जाएगा और RequestId = 3 दोहराने:

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] = 3 and 
     OrderNumber in 
(
    SELECT [OrderNumber] 
    FROM Workflow_Txn 
    WHERE [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3)  
    AND RequestId = 3 
) 
+0

मुझे भी आसान तरीका पसंद है (हालांकि मैं समाधान में दिए गए कारणों के लिए अपनी पहली विधि पसंद करता हूं)। हालांकि, मेरा मानना ​​है कि @ स्टुअर्टएन्सवर्थ ने पहले सरलीकृत संस्करण के साथ उत्तर दिया - यही कारण है कि मैंने उसका जवाब ऊपर उठाया। –

4

आपका सबक्वेरी सिर्फ 3 की RequestID वापस जाने के लिए है, तो आप उस आईडी से अनुरोध के सभी अद्यतन कहा, इसे चलना

UPDATE Workflow_Txn 
SET Status = 1 
WHERE [RequestId] = 3 
AND [OrderNumber] < (SELECT MAX(OrderNumber) FROM Workflow_Txn WHERE RequestId = 3) 
संबंधित मुद्दे