2012-12-21 13 views
135

तो यहां मैं अपने MySQL डेटाबेस पर क्या करना चाहता हूं।मैं SQL स्ट्रिंग में 'अगर क्लॉज' कैसे डालूं?

मैं करना चाहते हैं:

SELECT * 
    FROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING' 

है कि किसी भी पंक्तियाँ, जो if(dr.HasRows == false) माध्यम से संभव है वापस नहीं चाहते हैं, तो मैं अब एक UPDATEpurchaseOrder डेटाबेस में बनाना होगा:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' 

कैसे होगा मैं इस प्रक्रिया को थोड़ा छोटा बनाने में सक्षम हूं?

+4

itemsOrdered डेटाबेस के लिए एक अनूठा itemsOrdered_ID' बुलाया 'आईडी है में मदद करता है और' आवर्ती है purchaseOrder_ID' महत्व देता –

+1

दूसरी तरफ 'purchaseorder' डेटाबेस अनन्य आईडी है' purchaseOrder_ID' –

उत्तर

288

अपने विशिष्ट क्वेरी के लिए, आप कर सकते हैं:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID' and 
      not exists (SELECT * 
         FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING' 
        ) 

हालांकि, मुझे लगता है कि हो सकता है कि आप एक उच्च स्तर पर पाशन कर रहे हैं। ऐसे सभी मूल्यों को निर्धारित करने के लिए, इस प्रयास करें:

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE not exists (SELECT 1 
         FROM itemsOrdered 
         WHERE itemsOrdered.purchaseOrder_ID = purchaseOrder.purchaseOrdered_ID AND 
          status = 'PENDING' 
         limit 1 
        ) 
+18

असल में MySQL में, सहसंबंधित सबक्वायरी सबसे कुशल दृष्टिकोणों में से एक होना चाहिए, मानते हैं कि आइटम्सऑर्डर्ड.पुरचेसऑर्डर_आईडी पर एक इंडेक्स है। –

+5

@eggyal। । । मैं मानता हूं कि एक सूचकांक के बिना सहसंबंधित संस्करण शायद शामिल होने से कम प्रदर्शनकारी है (विभिन्न कारकों पर निर्भर करता है, जैसे कि पंक्तियों के गुणा)। एक सूचकांक के साथ, हालांकि, यह शामिल होने से बेहतर होना चाहिए क्योंकि इसे पहले मैच में इंडेक्स स्कैन को रोकना चाहिए। Http://dev.mysql.com/doc/refman/5.5/en/subquery-optimization-with-exists.html देखें। –

41

आप एक से अधिक-टेबल एक ANTI-JOINpurchaseOrder के बीच और itemsOrdered प्रभाव UPDATE सिंटैक्स का उपयोग कर सकते हैं:

UPDATE purchaseOrder p LEFT JOIN itemsOrdered i 
    ON p.purchaseOrder_ID = i.purchaseOrder_ID 
    AND i.status = 'PENDING' 
SET p.purchaseOrder_status = 'COMPLETED' 
WHERE p.purchaseOrder_ID = '@purchaseOrder_ID' 
    AND i.purchaseOrder_ID IS NULL 
37

के बाद से MySQL if exists(*Your condition*) (*Write your query*) का समर्थन नहीं करता है, तो आप इस तरह लिख कर एक 'अगर खंड' को प्राप्त कर सकते हैं:

(*Write your insert or update query*) where not exists (*Your condition*) 
14
Select FROM t1 
    WHERE s11 > ANY 
     (SELECT col1,col2 FROM t2 
      WHERE NOT EXISTS 
       (SELECT * FROM t3 
        WHERE ROW(5*t2.s1,77)= 
         (SELECT 50,11*s1 FROM t4 UNION SELECT 50,77 FROM 
          (SELECT * FROM t5) AS t5))); 
+3

मैं यह देखने के लिए संघर्ष कर रहा हूं कि यह प्रश्न का उत्तर कैसे देता है? – theMayer

+1

@theMayer Me भी, लेकिन यह एक बहुत अच्छा जवाब है – Gabriel

18

तुम भी अगर रिकॉर्ड मौजूद है की जाँच करने के निम्न क्वेरी का उपयोग कर सकते हैं और फिर इसे अद्यतन:

if not exists(select top 1 fromFROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING') 
Begin 

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID 

End 
6
if not exists(select top 1 fromFROM itemsOrdered 
    WHERE purchaseOrder_ID = '@purchaseOrdered_ID' 
     AND status = 'PENDING') 
Begin 

UPDATE purchaseOrder 
    SET purchaseOrder_status = 'COMPLETED' 
    WHERE purchaseOrder_ID = '@purchaseOrder_ID 

End 
+6

यदि आप उत्तर भी समझाते हैं तो यह बहुत अच्छा होगा, कोड केवल उत्तर भविष्य के उपयोगकर्ताओं के लिए उपयोगी नहीं है –

4

जब आप का उपयोग एसक्यूएल में मर्ज डालने, अद्यतन और के आधार पर हटा करने के लिए इसे आप मदद कर सकते हैं एसक्यूएल सर्वर में मैच बयान उदाहरण की तरह यह आप https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx

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