Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एक ही SQL क्वेरी में WITH और UPDATE स्टेटमेंट का उपयोग करना

आप किसी अद्यतन में खंड के साथ उपयोग कर सकते हैं; आपको बस इसे सही जगह पर करना है:

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

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

UPDATE mytable
   SET name = (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT newvalue
               FROM   temp
               WHERE  mytable.name = temp.oldvalue)
WHERE  EXISTS (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                            (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                           )
               SELECT NULL
               FROM   temp
               WHERE  mytable.name = temp.oldvalue);

वैकल्पिक रूप से, MERGE स्टेटमेंट का उपयोग करें:

merge into mytable tgt
  using (WITH temp AS((SELECT 'abcd' AS oldvalue, 'defg' AS newvalue FROM dual) UNION
                      (SELECT .....) --About 300 lines of this, copied from Excel and then formatted into the SELECT statement
                     )
         SELECT mytable.rowid r_id,
                temp.newvalue
         FROM   temp
         inner  join mytable on mytable.name = temp.oldvalue) src
    on (tgt.rowid = src.r_id)
when matched then
update set tgt.name = src.newvalue;

एन.बी. आपको मर्ज स्टेटमेंट की स्रोत क्वेरी में वास्तविक तालिका में शामिल होना होगा क्योंकि आप उस कॉलम को अपडेट करने का प्रयास कर रहे हैं, जिस पर आप शामिल हो रहे हैं, जिसे आप मर्ज स्टेटमेंट में नहीं कर सकते हैं - इसलिए मैंने मर्ज में शामिल होने के लिए स्विच किया है mytable.rowid पर शामिल हों।

आपको यह देखने के लिए दोनों कथनों का परीक्षण करना होगा कि कौन सा आपके डेटा पर सबसे अधिक प्रदर्शन करता है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle डाटाबेस 18c . में सीडीबी बेड़े का प्रबंधन

  2. दो टेबल पर चलने वाला ट्रिगर बनाना

  3. आंतरायिक ORA-12519 (TNS:कोई उपयुक्त हैंडलर नहीं मिला) त्रुटियों का कारण क्या हो सकता है

  4. ORACLE सेलेक्ट डिस्टिंक्ट कई कॉलम लौटाता है और कहाँ

  5. जेडीबीसी में बाध्य चर निष्पादन के साथ एसक्यूएल क्वेरी