在細節(jié)上,體現編程的修養(yǎng)。每一位大師,master,其基礎必定夯實。廢話不多說,直接上干貨,Merge子句用于對兩個數據表執(zhí)行數據同步,On子句指定匹配(when matched)條件,When子句指定額外的過濾條件和數據更新邏輯。源表(Source Table)和靶表(Targe Table)的數據行能夠匹配成功,這意味著on子句和when match條件都被滿足,進入到when matched子句定義的更新代碼中,執(zhí)行數據同步操作;如果不滿足on子句,那么必須深入理解不匹配(when not matched)子句的條件,否則,很容易出錯。首先查看MSDN對On子句的定義:

ON <merge_search_condition>  Specifies the conditions on which source_table_ is joined with target_table to determine where they match.

也就是說,如果兩個數據行滿足on子句條件,那么數據處理程序跳轉到when matched子句;如果兩個數據行不滿足on子句,那么數據處理程序跳轉到when not matched子句。如果在on子句中只指定源表列和靶表列之間的匹配關系,那么同步操作一般不會出現“意外"的問題,意外是指符合設計者的預期。一旦在on子句中試圖過濾靶表或源表的數據行,那么,再執(zhí)行數據同步可能出現異常結果,出現不符合設計者預期的行為。實際上,MSDN已經明確給出提示,不要忽略這個提示,不然,你很可能已經挖了坑而不自知:

It is important to specify only the columns from the target table that are used for matching purposes. That is, specify columns from the target table that are compared to the corresponding column of the source table. Do not attempt to improve query performance by filtering out rows in the target table in the ON clause, such as by specifying AND NOT target_table.column_x = value. Doing so may return unexpected and incorrect results.

在開始測試when not matched子句的陷進之前,使用以下腳本創(chuàng)建示例數據:

大數據培訓,云培訓,數據挖掘培訓,云計算培訓,高端軟件開發(fā)培訓,項目經理培訓 View Code

一,在on子句中過濾源表

1,在Merge的On子句中,使用額外的篩選條件(s.Code>0)對SourceTable進行過濾

對源表進行過濾,初衷是為了將SourceTable中Code>0的數據作為數據源同步到TargetTable,但是,在Merge命令的On