मुझे लगता है कि जब आप प्रश्न को दोबारा प्रस्तुत करते हैं तो आप सिंटैक्स चाहते हैं जो ओरेकल और एसक्यूएल सर्वर दोनों पर काम करेगा, भले ही यह अनिवार्य रूप से केवल एक टेबल को प्रभावित करेगा।
प्रवेश स्तर 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
);