अधिकांश परिस्थितियों में, SQL अद्यतन प्रत्यक्ष संदर्भ का उपयोग करके निष्पादित किए जाते हैं किसी विशेष तालिका में (UPDATE books SET books.title = 'The Hobbit' WHERE books.id = 1
) फिर भी, कभी-कभी, तालिका की सामग्री को अप्रत्यक्ष रूप से में परिवर्तन करना फायदेमंद साबित हो सकता है , द्वितीयक क्वेरी स्टेटमेंट से प्राप्त डेटा के सबसेट का उपयोग करके।
एक UPDATE
प्रदर्शन कर रहा है एक द्वितीयक SELECT
का उपयोग करना कथन को दो तरीकों में से एक में पूरा किया जा सकता है, मुख्य रूप से यह निर्भर करता है कि आप SQL सर्वर के किस संस्करण का उपयोग कर रहे हैं। हम संक्षेप में दोनों विकल्पों का पता लगाएंगे ताकि आप पा सकें कि आपके लिए सबसे अच्छा क्या काम करता है।
इनर जॉइन का उपयोग करना
सभी SQL सर्वर स्थापनाओं के लिए, इस क्रिया को करने का सबसे बुनियादी तरीका INNER JOIN
का उपयोग करना है , जिससे दो अलग-अलग तालिकाओं के स्तंभों में मानों की एक दूसरे से तुलना की जाती है।
UPDATE
books
SET
books.primary_author = authors.name
FROM
books
INNER JOIN
authors
ON
books.author_id = authors.id
WHERE
books.title = 'The Hobbit'
ऊपर दिए गए उदाहरण में, हम UPDATING
books.primary_author
authors.name
. से मेल खाने के लिए फ़ील्ड JOINING
. द्वारा 'द हॉबिट' के लिए क्वेरी में दोनों तालिकाएं authors.id
. के संबंधित, मेल खाने वाले मानों से संबंधित हैं और books.author_id
।
एक साथ अपडेट और INSERT के लिए MERGE का उपयोग करना
SQL Server 2008 और नए के लिए, Microsoft ने असाधारण रूप से उपयोगी MERGE
. पेश किया ऑपरेशन जो उपरोक्त INNER JOIN
. के समान है विधि, लेकिन MERGE
UPDATE
दोनों को निष्पादित करने का प्रयास करता है और एक INSERT
एक साथ आदेश। यह प्रदर्शन की गई क्वेरी के आधार पर दो तालिकाओं को प्रभावी ढंग से सिंक्रनाइज़ करता है, दोनों के मिलान के लिए आवश्यक रिकॉर्ड को अद्यतन और सम्मिलित करता है।
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
MERGE
. का उपयोग करते समय पूरी क्वेरी मूल INNER JOIN
. की तुलना में निश्चित रूप से थोड़ा अधिक जटिल है , लेकिन एक बार जब आप समझ जाते हैं कि ऑपरेशन कैसे काम करता है, तो आप जल्दी से समझ जाएंगे कि यह क्षमता वास्तव में कितनी शक्तिशाली हो सकती है।
पहली कुछ पंक्तियाँ आत्म-व्याख्यात्मक हैं:
MERGE INTO
books
USING
authors
ON
books.author_id = authors.id
हम MERGE INTO
(UPDATE
/INSERT
) books
द्वितीयक authors
. का उपयोग करके तालिका तालिका, और हम एक ही books.author_id = authors.id
के आधार पर दोनों का मिलान कर रहे हैं तुलना।
जहां MERGE
कमांड अलग-अलग ब्रांचिंग लॉजिक में है जो इस प्रकार है।
WHEN MATCHED THEN
UPDATE SET
books.primary_author = authors.name
यहां हम SQL को केवल तभी कार्रवाई करने के लिए कह रहे हैं जब रिकॉर्ड MATCHED
. हो - जब कोई मौजूदा रिकॉर्ड पाया जाता है। उस स्थिति में, हम एक मानक UPDATE
perform करते हैं जैसा हमने पहले किया था, books.primary_author
. को सेट करना authors.name
. के बराबर फ़ील्ड फ़ील्ड.
अंत में, यदि क्वेरी को एक मेल खाने वाले तुलनात्मक रिकॉर्ड का पता चलता है जो नहीं मौजूद हैं, हम इसके बजाय एक INSERT
perform करते हैं ।
WHEN NOT MATCHED THEN
INSERT
(books.author_id, books.primary_author)
VALUES
(authors.id, authors.name)
यहां हम केवल SQL को INSERT
. के लिए कह रहे हैं books
. में एक नया रिकॉर्ड author_id
. के मानों के साथ तालिका और पासिंग और primary_author
संबंधित authors
. से लिए गए फ़ील्ड टेबल रिकॉर्ड।
हमारे MERGE
. का अंतिम परिणाम कथन यह है कि प्रत्येक . के लिए authors
. में लेखक तालिका में, हम सत्यापित करते हैं कि क्या संबंधित पुस्तक books
. में मौजूद है . यदि कोई रिकॉर्ड मिलता है, तो हम सुनिश्चित करते हैं कि books.primary_author
UPDATE
using का उपयोग करके सेट किया गया है , और जहां कोई मिलान नहीं मिलता है, हम books
. में एक नया रिकॉर्ड जोड़ते हैं ।
इसके साथ, आपको दो अलग-अलग तरीकों की ठोस समझ होनी चाहिए जिनका उपयोग UPDATE
. करने के लिए किया जा सकता है द्वितीयक, तुलनात्मक SELECT
. का उपयोग करके SQL में रिकॉर्ड बयान।