T-SQL筆記57_MERGE...USING語句使用_part1.When Matched/When Not Matched

最近又回鍋到Porting母公司系統的職務了。
近期在閱讀公司上千行的預存程序既有的程式碼邏輯時候,又發現一個有點陌生的語句。
Merge .... Using... When Matched/When Not Matched
真的有點複雜



https://csharp-video-tutorials.blogspot.com/2014/09/part-69-merge-in-sql-server.html

微軟在 SQL Server 2008 及以後的版本中添加了 Merge 語句,使用
Merge 語句可以多個 SQL 的 DML 語句組合成一個整體操作,從而
解決實現同樣的功能簡化 SQL 語句和事務。

DML 操作語句指的是對表執行
插入(INSERT)、更新(UPDATE)和刪除(DELETE)數據的操作。


與 Merge 語句搭配使用到的 USING 語句,可根據條件執行 DML 操作。
如此一來,就可以根據相關的條件對目標表執行插入、更新和刪除操作。

Merge 語句執行的操作中,會涉及到兩張表,一張表稱為來源表,另一張表稱為目標表。


語法如下:

MERGE [TOP (表達式)] INTO <目標表> AS 別名
USING <來源表或一個來源查詢結果> [AS 別名]
ON <條件表達式>
[WHEN MATCHED THEN DML 操作]
[WHEN NOT MATCHED THEN DML 操作]
[WHEN NOT MATCHED BY SOURCE]



(1). 使用 MERGE 指定目標表,目標表名放在 INTO 關鍵字的後面。
(2). AS 關鍵字後面是給目標表起一個別名。
(3). TOP 表示只對指定的前幾條執行 DML 操作。
(4). USING 指定源表,並使用 AS 指定別名。
(5). 使用 ON 將源表和目標表建立連接。
(6). 使用 WHEN…THEN 指定匹配條件。
(7). MATCHED 表示如果 ON 條件匹配上了,則執行的 DML 操作。
(8). NOT MATCHED 表示如果 ON 條件未匹配上,則執行的 DML 操作。




SQL測試資料案例建立

CREATE TABLE SourceTable
(
Id int primary key not null,
STitle nvarchar(5)
)
CREATE TABLE TargetTable
(
Id int primary key not null,
TTitle nvarchar(5)
)
INSERT INTO SourceTable(Id,STitle) VALUES(1,'小明1'),(2,'小陳1'),(3,'小林1'),(4,'張三1')
INSERT INTO TargetTable(Id,TTitle) VALUES(1,'小明2'),(2,'小陳2'),(11,'小林2'),(22,'張三2')
GO



這兩張表前兩筆的主鍵ID相同

在此測試使用 MERGE 實現當 2 張表具有匹配數據時,對目標表執行更新操作。
SQL語句-MERGE MATCHED

MERGE INTO TargetTable AS T
USING SourceTable AS S
ON T.Id=S.Id
WHEN MATCHED
THEN UPDATE SET T.TTitle = S.STitle;
在表與表之間,有匹配就有未匹配,匹配剩下的都是未匹配的。
對於 MERGE 語句使用 WHEN MATCHED 表示匹配,
而使用 WHEN NOT MATCHED 表示不匹配。
MATCHED 和 NOT MATCHED 可以一起使用,也可以單獨使用。
對 2 張表中不匹配的記錄執行插入操作。

將測試資料恢復成原先狀態

drop table SourceTable
drop table  TargetTable
CREATE TABLE SourceTable
(
Id int primary key not null,
STitle nvarchar(5)
)
CREATE TABLE TargetTable
(
Id int primary key not null,
TTitle nvarchar(5)
)
INSERT INTO SourceTable(Id,STitle) VALUES(1,'小明1'),(2,'小陳1'),(3,'小林1'),(4,'張三1')
INSERT INTO TargetTable(Id,TTitle) VALUES(1,'小明2'),(2,'小陳2'),(11,'小林2'),(22,'張三2')
GO
select * from SourceTable
select * from TargetTable


SQL語句-MERGE NOT MATCHED

MERGE INTO TargetTable AS T
USING SourceTable AS S
ON T.Id=S.Id
WHEN NOT MATCHED
THEN INSERT VALUES(S.Id,S.STitle);






如果源表中的記錄在目標表中不存在的,則將這些不存在的記錄全部插入到目標表中。





留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題