खोज…


परिचय

SQL सर्वर 2008 के साथ शुरू करना, MERGE स्टेटमेंट का उपयोग करके किसी एकल स्टेटमेंट में इंसर्ट करना, अपडेट करना या हटाना संभव है।

MERGE स्टेटमेंट आपको एक लक्ष्य तालिका या दृश्य के साथ डेटा स्रोत में शामिल होने की अनुमति देता है, और फिर उस जॉइन के परिणामों के आधार पर लक्ष्य के विरुद्ध कई क्रियाएं करता है।

वाक्य - विन्यास

  • MSDN के अनुसार - https://msdn.microsoft.com/en-us/library/bb510625.aspx [with <common_table_expression> [, ... n]] MERGE [TOP (अभिव्यक्ति) [PERCENT]] [INTO] < target_table> [with (<merge_hint>)] [[AS] table_alias] USING <table_source> ON <merge_search_condition> [WHEN MATCHED [AND <clause -search_condition>] THEN <merge_matched>] [...] []] WHEN MATCHED TARGET] [और <clause_search_condition>] THEN <merge_not_matched>] [WHEN NOT MATCHED by SOURCE [और <clause_search_condition>> THEN <merge_matched>] [...] [n] [<output_clause>] <OPTION [क्वेरी]। .. एन]]]; <target_table> :: = {[database_name स्कीमा_नाम। | स्कीमा_नाम। ] target_table} <merge_hint> :: = {{<<table_hint_limited> [, ... n]] [[,] INDEX (index_val [, ... n])]}}} <table_source # :: = {table_or_view_name [ [AS] table_alias] [<tableample_clause>] [with (table_hint [[,] ... n]]] | rowet_function [[AS] table_alias] [(बल्क_कल्युमन_लियास [, ... n])] | user_defined_function [[एएस] table_alias] | OPENXML <openxml_clause> | der_table [AS] table_alias [(column_alias [, ... n])] | <join_table> | <pivoted_table> | <unpivoted_table>} <merge_search_condition> :: = <search_condition> <merge_matched> :: = {UPDATE SET <set_clause> | DELETE} <set_clause> :: = SET {column_name = {व्यंजक | DEFAULT | नल} | {udt_column_name। {{property_name = अभिव्यक्ति | field_name = अभिव्यक्ति} | Method_name (तर्क [, ... n])}} | column_name {.WRITE (अभिव्यक्ति, @ लाभ, @ गति)} | @ अपरिवर्तनीय = अभिव्यक्ति | @ परिवर्तनीय = स्तंभ = अभिव्यक्ति | column_name {+ = | - = | * = | / = | % = | & = | ^ = | | =} अभिव्यक्ति | @ परक्राम्य {+ = | - = | * = | / = | % = | & = | ^ = | | =} अभिव्यक्ति | @ परिवर्तनीय = स्तंभ {+ = | - = | * = | / = | % = | & = | ^ = | | =} एक्सप्रेशन} [, ... n] <merge_not_matched> :: = {INSERT [(column_list)] {VALUES (मान_लिस्ट) | DEFAULT VALUES}} <clause_search_condition> :: = = <search_condition> :: = {[नहीं]] | (<search_condition>)} [{AND | या} [नहीं] {| (<search_condition>)}] [... ... n] :: = {व्यंजक {= | <> | ! = |

    | > = | ! > | <| <= | ! <} अभिव्यक्ति | string_expression [NOT] LIKE string_expression [ESCAPE 'एस्केप_चैकर'] | अभिव्यक्ति [नहीं] बेहतर अभिव्यक्ति और अभिव्यक्ति | अभिव्यक्ति IS [नहीं] NULL | CONTAINS ({कॉलम | *}, _ <होते_search_condition> ’) | FREETEXT ({कॉलम | *}, 'freetext_string') | व्यंजक [NOT] IN (उपश्रेणी | अभिव्यक्ति [, ... n]) | अभिव्यक्ति {= | <> | ! = | | > = | ! > | <| <= | ! <} {सभी | कुछ | कोई} (उपश्रेणी) | EXISTS (उपश्रेणी)} <output_clause> :: = {[OUTPUT <dml_select_list> INTO {@table_variable | output_table} [(column_list)]] [OUTPUT <dml_select_list>]} <dml_select_list> :: = = {<column_name> | scalar_expression} [[AS] column_alias_identifier] [, ... n] <column_name> :: = {{DELETED | INSERTED | from_table_name}। {{| column_name} | $ कार्रवाई

टिप्पणियों

स्रोत तालिका के साथ जुड़ने के परिणामों के आधार पर लक्ष्य तालिका में सम्मिलित, अद्यतन या हटाए गए कार्य करता है। उदाहरण के लिए, आप दूसरी तालिका में पाए गए मतभेदों के आधार पर पंक्तियों को एक तालिका में सम्मिलित, अद्यतन या हटाकर दो तालिकाओं को सिंक्रनाइज़ कर सकते हैं।

सम्मिलित करें / अद्यतन / हटाएँ करने के लिए

MERGE INTO targetTable

USING sourceTable 
ON (targetTable.PKID = sourceTable.PKID)

WHEN MATCHED AND (targetTable.PKID > 100) THEN
    DELETE

WHEN MATCHED AND (targetTable.PKID <= 100) THEN 
    UPDATE SET 
        targetTable.ColumnA = sourceTable.ColumnA, 
        targetTable.ColumnB = sourceTable.ColumnB

WHEN NOT MATCHED THEN
    INSERT (ColumnA, ColumnB) VALUES (sourceTable.ColumnA, sourceTable.ColumnB);

WHEN NOT MATCHED BY SOURCE THEN
    DELETE
; --< Required

विवरण:

  • MERGE INTO targetTable - टेबल को संशोधित किया जाना है
  • स्रोत का USING sourceTable - डेटा का स्रोत (तालिका या दृश्य या तालिका मूल्यवान फ़ंक्शन हो सकता है)
  • ON ... - targetTable और sourceTable बीच targetTable sourceTable
  • WHEN MATCHED - जब एक मैच पाया जाता है
    • AND (targetTable.PKID > 100) - अतिरिक्त स्थिति (स्थिति) जो कार्रवाई किए जाने के लिए संतुष्ट होनी चाहिए
  • THEN DELETE - targetTable से मिलान रिकॉर्ड को हटा targetTable
  • THEN UPDATE - SET .... रिकॉर्ड के अपडेट किए गए कॉलम SET .... द्वारा निर्दिष्ट किए गए SET ....
  • WHEN NOT MATCHED - जब मैच targetTable में नहीं पाया जाता है तो कार्रवाई करने के लिए
  • WHEN NOT MATCHED BY SOURCE मिलान नहीं किया जाता है - जब मैच sourceTable में नहीं sourceTable

टिप्पणियाँ:

यदि एक विशिष्ट कार्रवाई की आवश्यकता नहीं है, तो शर्त को छोड़ दें जैसे कि WHEN NOT MATCHED THEN INSERT रिकॉर्ड को सम्मिलित होने से रोका जाएगा

मर्ज कथन के लिए एक समाप्ति अर्धविराम की आवश्यकता होती है।

प्रतिबंध:

  • WHEN MATCHED है तो INSERT कार्रवाई की अनुमति नहीं देता है
  • UPDATE कार्रवाई केवल एक बार एक पंक्ति को अपडेट कर सकती है। इसका तात्पर्य यह है कि जुड़ने की स्थिति में अनूठे मैच होने चाहिए।

CTE सोर्स का उपयोग करके मर्ज करें

WITH SourceTableCTE AS
(
    SELECT * FROM SourceTable
)
MERGE  
 TargetTable AS target
USING SourceTableCTE AS source  
ON (target.PKID = source.PKID)
WHEN MATCHED THEN     
    UPDATE SET target.ColumnA = source.ColumnA
WHEN NOT MATCHED THEN
    INSERT (ColumnA) VALUES (Source.ColumnA);

व्युत्पन्न स्रोत तालिका का उपयोग कर MERGE

MERGE INTO TargetTable  AS Target  
USING (VALUES (1,'Value1'), (2, 'Value2'), (3,'Value3'))  
       AS Source (PKID, ColumnA)  
ON Target.PKID = Source.PKID 
WHEN MATCHED THEN 
    UPDATE SET target.ColumnA= source.ColumnA
WHEN NOT MATCHED THEN
    INSERT (PKID, ColumnA) VALUES (Source.PKID, Source.ColumnA);

मर्ज उदाहरण - स्रोत और लक्ष्य तालिका सिंक्रनाइज़ करें

MERGE स्टेटमेंट का चित्रण करने के लिए, निम्नलिखित दो तालिकाओं पर विचार करें -

  1. dbo.Product : इस तालिका में उस उत्पाद के बारे में जानकारी है जिसे कंपनी वर्तमान में बेच रही है

  2. dbo.ProductNew : इस तालिका में उस उत्पाद के बारे में जानकारी है जिसे कंपनी भविष्य में बेचेगी।

निम्न T-SQL इन दो तालिकाओं को बनाएगा और उन्हें आबाद करेगा

IF OBJECT_id(N'dbo.Product',N'U') IS NOT NULL 
DROP TABLE dbo.Product
GO

CREATE TABLE dbo.Product (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)

IF OBJECT_id(N'dbo.ProductNew',N'U') IS NOT NULL 
DROP TABLE dbo.ProductNew
GO

CREATE TABLE dbo.ProductNew (
ProductID INT PRIMARY KEY,
ProductName NVARCHAR(64),
PRICE MONEY
)

INSERT INTO dbo.Product VALUES(1,'IPod',300)
,(2,'IPhone',400)
,(3,'ChromeCast',100)
,(4,'raspberry pi',50)

INSERT INTO dbo.ProductNew VALUES(1,'Asus Notebook',300)
,(2,'Hp Notebook',400)
,(3,'Dell Notebook',100)
,(4,'raspberry pi',50)

अब, मान लीजिए कि हम dbo.ProductNew तालिका के साथ dbo.Product लक्ष्य तालिका को सिंक्रोनाइज़ करना चाहते हैं। यहाँ इस कार्य के लिए मानदंड है:

  1. उत्पाद जो dbo.ProductNew स्रोत तालिका और dbo.Product लक्ष्य तालिका दोनों में मौजूद है, नए नए उत्पादों के साथ dbo.Product लक्ष्य तालिका में अपडेट किए गए हैं।

  2. Dbo.ProductNew स्रोत तालिका में मौजूद कोई भी उत्पाद dob.Product लक्ष्य तालिका में मौजूद नहीं है। dbo.Product लक्ष्य तालिका में सम्मिलित किए गए हैं।

  3. Dbo.Product लक्ष्य तालिका में मौजूद कोई भी उत्पाद dbo.ProductNew स्रोत तालिका में मौजूद नहीं है। dbo.Product लक्ष्य तालिका से हटा दिया जाना चाहिए। इस कार्य को करने के लिए यहाँ MERGE कथन है।

MERGE dbo.Product AS SourceTbl 
USING dbo.ProductNew AS TargetTbl ON (SourceTbl.ProductID = TargetTbl.ProductID)
WHEN MATCHED 
            AND SourceTbl.ProductName <> TargetTbl.ProductName
            OR SourceTbl.Price <> TargetTbl.Price
    THEN UPDATE SET SourceTbl.ProductName = TargetTbl.ProductName,
                SourceTbl.Price = TargetTbl.Price
WHEN NOT MATCHED 
    THEN INSERT (ProductID, ProductName, Price)
         VALUES (TargetTbl.ProductID, TargetTbl.ProductName, TargetTbl.Price)
WHEN NOT MATCHED BY SOURCE 
    THEN DELETE
OUTPUT $action, INSERTED.*, DELETED.*;

नोट: अर्धविराम को MERGE कथन के अंत में मौजूद होना चाहिए। यहाँ छवि विवरण दर्ज करें

EXCEPT का उपयोग करके विलय करें

अपरिवर्तित रिकॉर्ड के अपडेट को रोकने के लिए EXCEPT का उपयोग करें

MERGE TargetTable targ
USING SourceTable AS src
    ON src.id = targ.id
WHEN MATCHED
    AND EXISTS (
        SELECT src.field
        EXCEPT
        SELECT targ.field
        )
    THEN
        UPDATE
        SET field = src.field
WHEN NOT MATCHED BY TARGET
    THEN
        INSERT (
            id
            ,field
            )
        VALUES (
            src.id
            ,src.field
            )
WHEN NOT MATCHED BY SOURCE
    THEN
        DELETE;


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow