آشنایی با دستور Merge در SQL Server

آشنایی با دستور Merge در SQL Server

نوشته شده توسط: تیم فنی نیک آموز
تاریخ انتشار: ۰۵ تیر ۱۴۰۰
آخرین بروزرسانی: ۲۵ آبان ۱۴۰۲
زمان مطالعه: 14 دقیقه
۴.۴
(۱۲)

مقدمه

در این مقاله قصد داریم شما را با دستور (Merge) در SQL Server به صورت مقدماتی آشنا کنیم این دستور از SQL 2008 معرفی شد، با استفاده از دستور  Marge می‌توان رکورد‌های جداول مورد نظر را یکسان سازی کرد.

مفاهیم

از دستور Merge در SQL Server  زمانی استفاده می‌کنیم که می‌خواهیم  اطلاعات دو جدول را مورد مقایسه قرار بدیم، که این دستور معمولاً  با استفاده از یک فیلد که در هر دو جدول مشترک می‌باشد یک ارتباط (Join) می‌دهد. که براساس فیلد‌های که ما مشخص می‌کنیم این دستور می‌تواند سه کار انجام دهد. اگر داده‌  جدول منبع (Source) در جدول مقصد (Target) وجود داشته باشد آن‌ها را به روز رسانی (Update)  خواهد کرد. اما اگر اطلاعات جدول source در جدول Target وجود نداشته باشد اطلاعات جدول source را در جدول Target ایجاد (insert) خواهد کرد در واقع اطلاعات هر دو جدول یکسان خواهد بود. و اگر رکوردی در جدول Target وجود داشته باشد اما در جدول Source نباشد آن رکورد از جدول Target حذف خواهد شد. چون در جدول Source ما هیچ تغییراتی نمی‌توانیم داشته باشیم.

دوره کوئری نویسی نیک آموز

گرامر (Syntax) مربوط به دستور Merge به صورت زیر می‌باشد.آشنایی با دستور Merge در SQL Server

MERGE target_table USING source_table
ON merge_condition
WHEN MATCHED
    THEN update_statement
WHEN NOT MATCHED
    THEN insert_statement
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

تاکنون با مفاهیم و کاربرد دستور Merge آشنا شدیم و Syntax مربوط به این دستور را هم در قالب یک کوئری نمایش دادیم در ادامه قصد داریم برای درک بهتر و کاربرد این دستور، یک مثال را پیاده سازی کنیم تا بیش‌تر با کاربرد دستور Merge آشنا شوید و در پروژه‌های خود مورد استفاده قرار بدید. برای اینکه مثال مد نظرمان را پیاده سازی کنیم ابتدا باید یک دیتابیس نمونه ایجاد کنیم و بعد دو جدول ایجاده کرده و یکسری رکورد تستی درج کنیم و بعد اطلاعات دو جدول را مورد بررسی قرار می‌دهیم و در نهایت اگر بین این دو جدول مغایرت اطلاعات داشته باشیم توسط دستور Merge اطلاعات هر دو جدول را یکسان می‌کنیم.

گام اول

با استفاده از کوئری زیر بررسی می‌کنیم که اگر دیتابیسی با نام «Sample» وجود داشت، دیتابیس را به حالت تک کاربره تنظیم می‌کنیم و دیتابیس را حذف کرده و مجدد ایجاد می‌کنیم.

IF DB_ID('[sample]') > 0
BEGIN
  ALTER DATABASE [sample] SET SINGLE_USER WITH ROLLBACK IMMEDIATE
  DROP DATABASE [sample]
END
GO

گام دوم

توسط کوئری زیر می‌خواهیم دیتابیسی با نام «Sample» ایجاد می‌کنیم.

CREATE DATABASE [sample]
ON PRIMARY
(
  NAME = [sample],
  FILENAME = 'C:\TEMP1\sample_DATA.MDF',
  SIZE = 100MB,
  MAXSIZE = 200MB,
  FILEGROWTH = 64536KB
)
LOG ON
(
  NAME = [sample_log],
  FILENAME = 'C:\TEMP1\sample_log.LDF',
  SIZE = 100MB,
  MAXSIZE = 200MB,
  FILEGROWTH = 64536KB
);
GO

گام سوم

با استفاده از کوئری زیر اسکیمای با نام (Sales) برای جدول منبع (Source) و جدول هدف (Target) ایجاد می‌کنیم.

CREATE SCHEMA sales;
GO

گام چهارم

با استفاده از کوئری زیر دو جدول ایجاد می‌کنیم با نام «Category» و «Category_Staging» یکی از جدول به عنوان جدول Source و دیگری به عنوان Target می‌باشد.

CREATE TABLE sales. category (
    category_id INT PRIMARY KEY,
    category_name VARCHAR (255) NOT NULL,
    amount DECIMAL (10, 2)
);
CREATE TABLE sales. Category_staging (
    category_id INT PRIMARY KEY,
    category_name VARCHAR (255) NOT NULL,
    amount DECIMAL (10, 2)
);

گام پنجم

درج چند رکورد تستی برای جدول «sales. category » و « sales. Category_staging» توسط کوئری زیر انجام می‌دهیم.

INSERT INTO sales. category (category_id, category_name, amount)
VALUES
(۱,'Children Bicycles',15000),
    (۲,'Comfort Bicycles',25000),
    (۳,'Cruisers Bicycles',13000),
    (۴,'Cyclocross Bicycles',10000);
GO
INSERT INTO sales. Category_staging (category_id, category_name, amount)
VALUES
(۱,'Children Bicycles',15000),
    (۳,'Cruisers Bicycles',13000),
    (۴,'Cyclocross Bicycles',20000),
    (۵,'Electric Bikes',10000),
    (۶,'Mountain Bikes',10000);
GO
SELECT * FROM sales. category;
SELECT * FROM sales.category_staging;

گام ششم

با استفاده از کوئری زیر می‌توانیم اطلاعات دو جدول را واکشی کنیم.آشنایی با دستور Merge در SQL Server

گام هفتم

اکنون می‌خواهیم با استفاده از دستور Merge اطلاعات دو جدولی که بیش از این ساختیم اطلاعات آن‌ها را مقایسه کنیم در صورت مغایرت اطلاعات لازم درج یا به روز رسانی شود.

MERGE sales. category t
    USING sales. category_staging s
ON (s. category_id = t. category_id)
WHEN MATCHED
    THEN UPDATE SET
        t. category_name = s. category_name,
        t. amount = s. amount
WHEN NOT MATCHED BY TARGET
    THEN INSERT (category_id, category_name, amount)
         VALUES (s. category_id, s. category_name, s. amount)
WHEN NOT MATCHED BY SOURCE
    THEN DELETE;

توضیحات مربوط به بخش (When Matched)

در این قسمت کوئری مربوط به دستور Merge تعداد رکورد و اطلاعات جدول هدف با جدول منبع مورد بررسی قرار می‌گیرد اگر رکورد‌های جدول هدف در جدول منبع وجود داشته باشد اطلاعات آن به روز رسانی خواهد شد.

توضیحات مربوط به بخش (When not Matched)

در این قسمت کوئری مربوط به دستور Merge تعداد رکورد و اطلاعات جدول هدف با جدول منبع مورد بررسی قرار می‌گیرد اگر رکورد‌های جدول هدف در جدول منبع مغایرت داشته باشد، رکورد‌های جدول منبع در جدول هدف اضافه خواهد شد.

توضیحات مربوط به دستور WHEN NOT MATCHED BY SOURCE

در دستور Merge این ویژگی وجود دارد، که اگر رکوردی در جدول هدف وجود  داشته اما در جدول منبع وجود نداشته باشد آن رکورد از جدول هدف حذف شود.
آشنایی با دستور Merge در SQL Server

گام هشتم

بعد از اینکه کوئری مربوط به دستور Merge را انجام دادیم می‌توانیم با کوئری زیر اطلاعات هر دو جدول را واکشی کنیم و خواهید دید که  نتیجه کوئری Merge اطلاعات دو جدول را یکسان کرده است.

SELECT * FROM sales. category;
SELECT * FROM sales. category_staging;

آشنایی با دستور Merge در SQL Server

 

برای بدست آوردن اطلاعات بیش‌تر در مورد دیگر دستورات SQL ، به مقاله زیر مراجعه کنید.
 
دستورهای SQL Server

چه رتبه ای می‌دهید؟

میانگین ۴.۴ / ۵. از مجموع ۱۲

اولین نفر باش

title sign
دانلود مقاله
آشنایی با دستور Merge در SQL Server
فرمت PDF
6 صفحه
حجم 1 مگابایت
دانلود مقاله
title sign
معرفی نویسنده
تیم فنی نیک آموز
مقالات
402 مقاله توسط این نویسنده
محصولات
0 دوره توسط این نویسنده
تیم فنی نیک آموز
title sign
دیدگاه کاربران