merge關鍵字是乙個神奇的dml關鍵字。它在sql server 2008被引入,它能將insert,update,delete簡單的並為一句。msdn對於merge的解釋非常的短小精悍:」根據與源表聯接的結果,對目標表執行插入、更新或刪除操作。例如,根據在另乙個表中找到的差異在乙個表中插入、更新或刪除行,可以對兩個表進行同步。」,通過這個描述,我們可以看出merge是關於對於兩個表之間的資料進行操作的。
merge的使用場景:
1.merge示例
首先建立源表和目標表,並插入相關的資料,如圖1所示。
下面寫乙個簡單的merge示例
merge into t_b as b
using t_a as a on b.id=a.id
when matched --當b.id=a.id時,更新目標表
then update set b.name=a.name,b.remark='更新記錄'
when not matched --若目標表中不存在,則新源表記錄插入目標表
then insert(id,name,book,remark) values(a.id,a.name,a.book,'從源表新增')
when not matched by source --源表中不存在,目標表存在
then delete;
執行前記錄:
執行後b表記錄:
2.output子句
merge語句還有乙個強大的功能是通過output子句,可以將剛剛做過變動的資料進行輸出。我們在上面的merge語句後加入output子句,如圖所示。
--merge output
merge into t_b as b
using t_a as a on b.id=a.id
when matched --當b.id=a.id時,更新目標表
then update set b.name=a.name,b.remark='更新記錄'
when not matched --若目標表中不存在,則新源表記錄插入目標表
then insert(id,name,book,remark) values(a.id,a.name,a.book,'從源表新增')
when not matched by source --源表中不存在,目標表存在
then delete
output $action as [action],inserted.id as 插入的id,inserted.name 插入的name,
deleted.id as 刪除的id,deleted.name as 刪除的name;
輸出結果:
3.其它條件組合使用
3.1 top約束
我們還可以使用top關鍵字限制目標表被操作的行。在上例的語句基礎上加上了top關鍵字,我們看到只有指定行被執行。
3.2and附加限制條件
注意:
1.不能有多個 matched 和 not matched,即使是加and 條件的也不行,只給有一次。
2.not matched by source 可以加條件出現多次,但不帶and 條件限制的not matched by source 必須出現在帶and 條件的後面。
sql語句
輸出結果如下圖:
執行前源表與目標表記錄:
執行後目標表結果:
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...