SQL स्ट्रिंग में मैं 'if क्लॉज' कैसे डालूं?


190

तो यहाँ मैं अपने MySQL डेटाबेस पर क्या करना चाहता हूँ ।

मैं करना चाहता हूँ:

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

यदि वह किसी भी पंक्तियों को वापस नहीं करेगा, जो कि संभव है if(dr.HasRows == false), तो मैं अब डेटाबेस UPDATEमें purchaseOrderबनाऊंगा:

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

मैं इस प्रक्रिया को कैसे छोटा बना पाऊंगा?


4
आइटम्सऑर्डर किए गए डेटाबेस में यूनिक आईडी होती है itemsOrdered_IDऔर आवर्ती purchaseOrder_IDमूल्य होते हैं
जॉन अर्नेस्ट

1
purchaseorderदूसरी ओर डेटाबेस अनन्य आईडी हैpurchaseOrder_ID
जॉन अर्नेस्ट ग्वाडालूप

जवाबों:


409

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

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
                     )

26
वास्तव में MySQL में, सहसंबद्ध सबक्वेरी सबसे कुशल दृष्टिकोणों में से एक होनी चाहिए, यह मानते हुए कि आइटम्स पर एक इंडेक्स है ।Oderdered.purchaseOrder_ID।
गॉर्डन लिनोफ़

8
@ लेगिंगल। । । मैं मानता हूं कि सूचकांक के बिना सहसंबंधित संस्करण जुड़ने की तुलना में शायद कम प्रदर्शन करने वाला है (विभिन्न कारकों पर निर्भर करता है, जैसे कि पंक्तियों का गुणन)। एक सूचकांक के साथ, हालांकि, यह एक जुड़ाव से बेहतर होना चाहिए क्योंकि यह पहले मैच में सूचकांक स्कैन को रोकना चाहिए। Dev.mysql.com/doc/refman/5.5/en/… चेक करें ।
गॉर्डन लिनऑफ

53

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

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

47

चूंकि MySQL समर्थन नहीं करता है if exists(*Your condition*) (*Write your query*), आप इस तरह लिखकर 'यदि क्लॉज' प्राप्त कर सकते हैं:

(*Write your insert or update query*) where not exists (*Your condition*)

27

रिकॉर्ड मौजूद है और फिर इसे अपडेट करने के लिए आप निम्न क्वेरी का उपयोग कर सकते हैं:

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

22
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)));

4
मैं यह देखने के लिए संघर्ष कर रहा हूं कि यह सवाल का जवाब कैसे देता है?
theMayer

1
@ मुझे भी, लेकिन यह एक बहुत अच्छा जवाब है
गेब्रियल

2
बधाई हो, आपका कोड एक अस्पष्ट कोड के रूप में चुना गया है।
विश्वनाथ दलवी

1
मुझे लगता है कि यह एक उदाहरण है कि हम और क्या कर सकते हैंSQL
टॉप-मास्टर

13
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

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

9

sql सर्वर 2008 Mergeएकल मिलान विवरण के आधार पर ऑपरेशन को सम्मिलित करने, अद्यतन करने और हटाने के लिए प्रदान करता है, जो आपको जुड़ने की अनुमति भी देता है। नीचे नमूना उदाहरण आपकी मदद कर सकता है।

MERGE Target AS T
USING Source AS S
ON (T.EmployeeID = S.EmployeeID) 
WHEN NOT MATCHED BY TARGET AND S.EmployeeName LIKE 'S%' 
    THEN INSERT(EmployeeID, EmployeeName) VALUES(S.EmployeeID, S.EmployeeName)
WHEN MATCHED 
    THEN UPDATE SET T.EmployeeName = S.EmployeeName
WHEN NOT MATCHED BY SOURCE AND T.EmployeeName LIKE 'S%'
    THEN DELETE 
OUTPUT $action, inserted.*, deleted.*;

इस तरह आप एक कथन में सम्मिलित, अद्यतन और हटा सकते हैं।

और अधिक जानकारी के लिए आप https://technet.microsoft.com/en-us/library/bb522522(v=sql.105).aspx पर आधिकारिक दस्तावेज़ देख सकते हैं


7

यदि तालिका में लाखों रिकॉर्ड हैं, तो निम्न क्वेरी तेजी से काम करेगी।

UPDATE PO
SET PO.purchaseOrder_status = 'COMPLETED'
FROM purchaseOrder PO
LEFT OUTER JOIN itemsOrdered IOD ON IOD.purchaseOrder_ID = PO.purchaseOrdered_ID and IOD.status = 'PENDING'
WHERE IOD.purchaseOrder_ID IS NULL

1

आप चुनिंदा क्वेरी पर लौटाए गए परिणामों की संख्या को पकड़कर एक चर घोषित कर सकते हैं। यदि आप यह चर 0 से अधिक है तो आप अपडेट स्टेटमेंट चला सकते हैं

    Declare @ResultCount int
    SELECT @ResultCount = count(*) FROM itemsOrdered WHERE purchaseOrder_ID = '@purchaseOrdered_ID' AND status = 'PENDING'        
    If @ResultCount > 0
UPDATE purchaseOrder SET purchaseOrder_status = 'COMPLETED' WHERE purchaseOrder_ID = '@purchaseOrder_ID'        
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.