SQL Server中的Merge關鍵字

2021-09-07 11:07:20 字數 3161 閱讀 7791

merge關鍵字是乙個神奇的dml關鍵字。它在sql server 2008被引入,它能將insert,update,delete簡單的並為一句。msdn對於merge的解釋非常的短小精悍:」根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。例如,根據在另乙個表中找到的差異在乙個表中插入、更新或刪除行,可以對兩個表進行同步。」,通過這個描述,我們可以看出merge是關於對於兩個表之間的資料進行操作的。

可以想象出,需要使用merge的場景比如:

首先是更加短小精悍的語句,在sql server 2008之前沒有merge的時代,基於源表對目標表進行操作需要分別寫好幾條insert,update,delete。而使用merge,僅僅需要使用一條語句就好。下面我們來看乙個例子。

首先建立源表和目標表,並插入相關的資料,如下**所示。

建立測試表並插入測試資料

--

建立源表

create

table sourcetable(id int,[

desc

]varchar(50

))--

建立目標表

create

table targettable(id int,[

desc

]varchar(50

))--

為源表插入資料

insert

into dbo.sourcetable(id,[

desc

]) values(1,'

描述1'

)insert

into dbo.sourcetable(id,[

desc

]) values(2,'

描述2'

)insert

into dbo.sourcetable(id,[

desc

]) values(3,'

描述3'

)insert

into dbo.sourcetable(id,[

desc

]) values(4,'

描述4')--

為目標表插入資料

insert

into dbo.targettable(id,[

desc

]) values(1,'

在源表裡存在,將會被更新')

insert

into dbo.targettable(id,[

desc

]) values(2,'

在源表裡存在,將會被更新')

insert

into dbo.targettable(id,[

desc

]) values(5,'

在源表裡不存在,將會被刪除')

insert

into dbo.targettable(id,[

desc

]) values(6,'

在源表裡不存在,將會被刪除')

go

下面我們來寫乙個簡單的merge語句,如下**所示。

乙個簡單的merge語句:

merge into targettable as

tusing sourcetable ass

on t.id=

s.id

when matched --

當上面on後面的t.id=s.id時,目標表中的id為1,2的資料被更新

then

update

set t.[

desc

]=s.[

desc

]when

not matched --

目標表中沒有id,在源表中有,則插入相關資料

then

insert

values(s.id,s.[

desc])

when

not matched by source --

目標表中存在,源表中不存在,則刪除

then

delete;

所造成的結果如下圖所示。

merge語句對於目標表的更新

最終目標表的結果如下圖所示。

最後目標表的結果

merge語句還有乙個強大的功能是通過output子句,可以將剛剛做過變動的資料進行輸出。我們在上面的merge語句後加入output子句,如下圖所示。

merge語句後加上output子句

此時merge操作完成後,將所變動的語句進行輸出,如圖6所示。

輸出merge操作產生的資料變更

當然了,上面的merge關鍵字後面使用了多個when…then語句,而這個語句是可選的.也可以僅僅新增或是僅僅刪除,如下圖所示。

僅僅插入的merge語句

我們還可以使用top關鍵字限制目標表被操作的行,如下圖所示。在第二段**的語句基礎上加上了top關鍵字,我們看到只有兩行被更新。

使用top關鍵字的merge語句

但僅僅是matched這種限制條件往往不能滿足實際需求,我們可以在圖7那個語句的基礎上加上and附加上額外的限制條件,如下圖所示。

加上了and限制條件的merge語句

本文簡單說明了merge關鍵的字的使用。如果你使用的是sql server 2008之後的版本,在面對一些比如庫存結賬之類的業務時,放棄if…else和手寫update,insert吧,使用merge關鍵字可以使這類操作更加輕鬆愉悅。

Git中pull對比fetch和merge

使用git fetch和git pull都可以更新遠端倉庫的 到本地,但是它們之間還是有區別。今天搜了一下git pull和fetch,發現資訊量很大,牽扯到git中很多概念,以我這種智商估計要完全理解很困難,所以先宣告一下,下面的內容是我綜合了網上的資料後,自己的理解,如有誤導,敬請諒解。首先,我...

SQL Server中的查詢

本博文簡單介紹一下sql server中常用的幾類查詢及相關使用的方法。一 executescalar方法獲取單一值 executescalar方法是sqlcommand類的方法之一,執行查詢,並返回查詢所返回的結果集中的第一行第一列。csharp view plain copy print cla...

SQL Server中row number的用法

row number 函式將針對select語句返回的每一行,從1開始編號,賦予其連續的編號。在查詢時應用了乙個排序標準後,只有通過編號才能夠保證其順序是一致的,當使用row number函式時,也需要專門一列用於預先排序以便於進行編號。row number 常用的幾種情況 1.使用row numb...