在本教學中,將學習如何使用SQL Server MERGE
語句根據與另一個表匹配的值更新表中的數據。
SQL Server MERGE語句簡介
假設有兩個表名為:source
表和target
表,並且需要根據source
表中匹配的值更新target
表。 有三種情況:
source
表有一些target
表中不存在的行。在這種情況下,需要將source
表中的行插入到target
表中。target
表有一些source
表中不存在的行。 在這種情況下,需要從target
表中刪除行。source
表的某些行具有與target
表中的行相同的鍵。 但是,這些行在非鍵列中具有不同的值。 在這種情況下,需要使用來自source
表的值更新target
表中的行。
下圖說明瞭source
表和target
表以及相應的操作:插入,更新和刪除:
如果單獨使用INSERT
,UPDATE
和DELETE
語句,則必須構造三個單獨的語句,以使用source
表中的匹配行將數據更新到target
表。
但是,SQL Server提供MERGE
語句以用於同時執行三個操作。 以下是MERGE
語句的語法:
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
子句中指定source_table
表和target_table
表。
其次,merge_condition
確定source_table
表中的行如何與target_table
表中的行匹配。 它類似於join
子句中的join
條件。 通常,使用主鍵或唯一鍵的鍵列進行匹配。
第三,merge_condition
有三種狀態:MATCHED
,NOT MATCHED
和NOT MATCHED BY SOURCE
。
MATCHED
:這些是與合併條件匹配的行。 在圖中,它們顯示為藍色。 對於匹配的行,需要使用source_table
表中的值更新target_table
表中的行列。NOT MATCHED
:這些是source_table
表中的行,target_table
表中沒有任何匹配的行。 在圖中,它們顯示為橙色。 在這種情況下,需要將source_table
表中的行添加到target_table
表。 請注意,NOT MATCHED BY TARGET
也稱為目標不匹配。NO MATCHED BY SOURCE
:這些是target_table
表中與source_table
表中的任何行都不匹配的行。 它們在圖中顯示為綠色。 如果要將target_table
表與source_table
表中的數據同步,則需要使用此匹配條件從target_table
表中刪除行。
SQL Server MERGE語句示例
假設有兩個表:sales.category
和sales.category_staging
,它們按產品類別存儲銷售額。參考以下創建語句:
CREATE TABLE sales.category (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(2,'Comfort Bicycles',25000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',10000);
CREATE TABLE sales.category_staging (
category_id INT PRIMARY KEY,
category_name VARCHAR(255) NOT NULL,
amount DECIMAL(10 , 2 )
);
INSERT INTO sales.category_staging(category_id, category_name, amount)
VALUES(1,'Children Bicycles',15000),
(3,'Cruisers Bicycles',13000),
(4,'Cyclocross Bicycles',20000),
(5,'Electric Bikes',10000),
(6,'Mountain Bikes',10000);
要使用sales.category_staging
(源表)中的值將數據更新到sales.category
(目標表),請使用以下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;
執行過程如下圖所示 -
在此示例中,使用兩個表中category_id
列中的值作為合併條件。
- 首先,
sales.category_staging
表中id
值為1
,3
,4
的行與目標表中的行匹配,因此,MERGE
語句更新sales.category
表中類別名稱和amount
列中的值。 - 其次,
sales.category_staging
表中id
值為5
和6
的行在sales.category
表中不存在,因此MERGE
語句將這些行插入到目標表中。 - 第三,
sales.sales_staging
表中不存在sales.category
表中具有id
值為2
的行,因此,MERGE
語句將刪除此行。
在合併的結果中,sales.category
表中的數據與sales.category_staging
表中的數據完全同步。
在本教學中,學習了如何使用SQL Server MERGE語句根據來自另一個表的匹配值在表中進行更改。