2013-02-27 21 views
12

मैं एसक्यूएल सर्वर का उपयोग कर रहा हूँ और एसक्यूएल उपयोग करने के लिए एक क्वेरी के साथ एक बार में एकाधिक तालिकाओं को अद्यतन करने की कोशिश कर रहा:अद्यतन एकाधिक तालिकाओं का उपयोग अंदरूनी शामिल हों

निम्न क्वेरी:

update table1 
set A.ORG_NAME = @ORG_NAME, B.REF_NAME = @REF_NAME 
from table1 A, table2 B 
where B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

देता है त्रुटि संदेश:

बहु-भाग पहचानकर्ता "A.ORG_NAME" बाध्य नहीं हो सका।

त्रुटि संदेश का क्या अर्थ है?

+2

विफल कैसे? त्रुटि संदेश? बस आप जो चाहते हैं उसे अपडेट नहीं कर रहे हैं? –

+4

'अद्यतन' को छोड़कर, कृपया, कृपया पुरानी शैली के जुड़ने को लिखना बंद करें। उचित 'इनर जॉइन' वाक्यविन्यास का प्रयोग करें। http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx –

उत्तर

20

आप अद्यतन नहीं कर सकते अधिक है कि एक ही बयान में एक मेज, तथापि त्रुटि संदेश मिलता है क्योंकि उपनाम की है, तो आप इस कोशिश कर सकते:

BEGIN TRANSACTION 

update A 
set A.ORG_NAME = @ORG_NAME 
from table1 A inner join table2 B 
on B.ORG_ID = A.ORG_ID 
and A.ORG_ID = @ORG_ID 

update B 
set B.REF_NAME = @REF_NAME 
from table2 B inner join table1 A 
    on B.ORG_ID = A.ORG_ID 
    and A.ORG_ID = @ORG_ID 

COMMIT 
+0

धन्यवाद। क्या 'प्रतिबद्ध' के बाद कीवर्ड 'end' डालना अच्छा अभ्यास है? या जरूरी नहीं है? – Coyolero

+3

* BEGIN ट्रांज़ेक्शन * * BEGIN * जैसा नहीं है जो एक ब्लॉक शुरू करता है (उदाहरण के लिए * IF * में उपयोग किया जाता है)। तो * END * का उपयोग न करें, यह अच्छा या बुरा अभ्यास का सवाल भी नहीं है, आप उस ब्लॉक को बंद कर सकते हैं जिसमें आप हैं और अप्रत्याशित आउटपुट – jazzytomato

10

तुम एक में शामिल होने अगर साथ अद्यतन कर सकते हैं आप केवल एक मेज इस तरह प्रभावित करते हैं:

UPDATE table1 
SET table1.name = table2.name 
FROM table1, table2 
WHERE table1.id = table2.id 
AND table2.foobar ='stuff' 

लेकिन आप एक अद्यतन बयान है कि एक से अधिक टेबल पर मिलती है के साथ कई तालिकाओं को प्रभावित करने की कोशिश कर रहे हैं। यह संभव नहीं है।

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

SQL JOINS

लेकिन यह एक बहुत hacky पार्लर चाल है, लेन-देन और कई अद्यतन उपयोग करें, यह बहुत अधिक सहज है।

+3

खोजें आपका बोल्ड स्टेटमेंट बिल्कुल सही नहीं है। आप एक जॉइन के आधार पर एक टेबल अपडेट कर सकते हैं, आपके पास अपडेट * प्रभाव * एकाधिक टेबल नहीं हो सकता है। और मैं सुझाए गए लिंक के हैक-ए-नेस के बारे में सहमत हूं (मैं इसे हटाने का भी सुझाव दे सकता हूं)। क्या दो वाकई लिखने से बचने के लिए यह सब कुछ करने लायक है? –

+0

लिंक यह वर्णन नहीं करता कि संघ का उपयोग कैसे करें, शायद यह उस ब्लॉग से एक और पोस्ट था? –

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