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

जॉइन (ओं) का उपयोग करके अपडेट करें - मल्टी डीबी/टेबल

मुझे लगता है कि जब आप प्रश्न को दोबारा प्रस्तुत करते हैं तो आप सिंटैक्स चाहते हैं जो ओरेकल और एसक्यूएल सर्वर दोनों पर काम करेगा, भले ही यह अनिवार्य रूप से केवल एक टेबल को प्रभावित करेगा।

प्रवेश स्तर SQL-92 मानक कोड दोनों प्लेटफार्मों द्वारा समर्थित है, इसलिए निम्न 'स्केलर सबक्वेरी' SQL-92 कोड काम करना चाहिए:

UPDATE table1 
   SET my_value = (
                   SELECT t2.tab1_id
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  )       
 WHERE id = 1234
       AND EXISTS (
                   SELECT * 
                     FROM table2 AS t2 
                    WHERE t2.tab1_id = table1.id
                  );

ध्यान दें कि सहसंबंध नाम का उपयोग करते समय t1 Ttble1 . के लिए SQL-92 मानक के अनुसार मान्य सिंटैक्स है यह एक तालिका और UPDATE . को अमल में लाएगा फिर भौतिक तालिका 't1' को लक्षित करेगा और आपकी आधार तालिका 'table1' को अप्रभावित छोड़ देगा, जो मुझे लगता है कि वांछित प्रभाव नहीं है। जबकि मुझे पूरा यकीन है कि Oracle और SQL सर्वर दोनों गैर-अनुपालन हैं, यह संबंध है और यह व्यवहार में अपेक्षित रूप से काम करेगा, लक्ष्य तालिका को पूरी तरह से अर्हता प्राप्त करके अत्यधिक सतर्क होने और SQL-92 सिंटैक्स से चिपके रहने में कोई बुराई नहीं है।

लोग उपरोक्त सबक्वेरी में 'दोहराए गए' कोड को पसंद नहीं करते हैं (भले ही ऑप्टिमाइज़र को केवल एक बार इसका मूल्यांकन करने के लिए पर्याप्त स्मार्ट होना चाहिए)।

Oracle और SQL सर्वर के हाल के संस्करण दोनों मानक SQL का समर्थन करते हैं:2003 MERGE सिंटैक्स, इसके करीब कुछ उपयोग करने में सक्षम हो सकता है:

MERGE INTO table1 
   USING (
          SELECT t2.tab1_id
            FROM table2 AS t2
         ) AS source
      ON id = source.tab1_id
         AND id = 1234
WHEN MATCHED THEN
   UPDATE
      SET my_value = source.tab1_id;

मैंने अभी देखा है कि आपका उदाहरण मेरे पहले विचार से भी आसान है और केवल एक साधारण सबक्वायरी की आवश्यकता है जो अधिकांश SQL उत्पादों पर चलना चाहिए उदा।

UPDATE table1
   SET my_value = 'foo'
 WHERE EXISTS (
               SELECT * 
                 FROM table2 AS t2 
                WHERE t2.tab1_id = table1.id
              );


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डीबी सीपीयू उपयोग प्रभाव देने वाली क्वेरी के बाद, क्या मैं तालिका में डेटा को कम कर सकता हूं जिससे मुझे डीबी सीपीयू प्रदर्शन को कम करने में मदद मिलेगी

  2. Parameter.AsString Oracle/MSSQL के तहत विफल - Parameter.Value 2-बाइट वर्ण Oracle के तहत

  3. स्पूल फ़ाइल में SQL> स्टेटमेंट छिपाएँ

  4. हर 5 मिनट में ताज़ा होने वाला भौतिक दृश्य बनाना

  5. Oracle SQL डेवलपर 1.5 में Oracle Sys_refcursor प्रिंट करना