Microsoft SQL Server
मर्ज
खोज…
परिचय
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 स्टेटमेंट का चित्रण करने के लिए, निम्नलिखित दो तालिकाओं पर विचार करें -
dbo.Product : इस तालिका में उस उत्पाद के बारे में जानकारी है जिसे कंपनी वर्तमान में बेच रही है
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 लक्ष्य तालिका को सिंक्रोनाइज़ करना चाहते हैं। यहाँ इस कार्य के लिए मानदंड है:
उत्पाद जो dbo.ProductNew स्रोत तालिका और dbo.Product लक्ष्य तालिका दोनों में मौजूद है, नए नए उत्पादों के साथ dbo.Product लक्ष्य तालिका में अपडेट किए गए हैं।
Dbo.ProductNew स्रोत तालिका में मौजूद कोई भी उत्पाद dob.Product लक्ष्य तालिका में मौजूद नहीं है। dbo.Product लक्ष्य तालिका में सम्मिलित किए गए हैं।
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;