在 SQL Server 中,MERGE 語句用于根據兩個表之間的條件來插入、更新或刪除記錄。它通常用于同步兩個表的數據,其中一個表是源表(包含要插入或更新的數據),另一個是目標表(數據要插入或更新的表)。
1、本文內容
- 語法
- 參數
- 備注
- 觸發器的實現
- 權限
- 有關索引的最佳做法
- MERGE 的并發注意事項
- 示例
- 相關內容
適用于:
- SQL Server
- Azure SQL 數據庫
- Azure SQL 托管實例
- Azure Synapse Analytics
根據與源表聯接的結果,對目標表進行插入、更新或刪除操作。 例如,根據與另一個表的區別,在一個表中插入、更新或刪除行,從而同步兩個表。
2、語法
SQL Server 和 Azure SQL 數據庫的語法:
[ WITH <common_table_expression> [,...n] ]
MERGE[ TOP ( expression ) [ PERCENT ] ][ INTO ] <target_table> [ WITH ( <merge_hint> ) ] [ [ AS ] table_alias ]USING <table_source> [ [ AS ] table_alias ]ON <merge_search_condition>[ WHEN MATCHED [ AND <clause_search_condition> ]THEN <merge_matched> ] [ ...n ][ WHEN NOT MATCHED [ BY TARGET ] [ AND <clause_search_condition> ]THEN <merge_not_matched> ][ WHEN NOT MATCHED BY SOURCE [ AND <clause_search_condition> ]THEN <merge_matched> ] [ ...n ][ <output_clause> ][ OPTION ( <query_hint> [ ,...n ] ) ]
;<target_table> ::=
{[ database_name . schema_name . | schema_name . ] [ [ AS ] target_table ]| @variable [ [ AS ] target_table ]| common_table_expression_name [ [ AS ] target_table ]
}<merge_hint>::=
{{ [ <table_hint_limited> [ ,...n ] ][ [ , ] { INDEX ( index_val [ ,...n ] ) | INDEX = index_val }]}
}<merge_search_condition> ::=<search_condition><merge_matched>::={ UPDATE SET <set_clause> | DELETE }<merge_not_matched>::=
{INSERT [ ( column_list ) ]{ VALUES ( values_list )| DEFAULT VALUES }
}<clause_search_condition> ::=<search_condition>
3、參數
-
WITH common_table_expression<>
指定在 MERGE 語句作用域內定義的臨時命名結果集或視圖,亦稱為“公用表表達式”。 結果集派生自簡單查詢,并由 MERGE 語句引用。 有關詳細信息,請參閱 WITH common_table_expression (Transact-SQL)。 -
TOP ( expression ) [ PERCENT ]
指定受影響的行數或所占百分比。 expression 可以是行數或行百分比。 在 TOP 表達式中引用的行不是以任意順序排列的。 有關詳細信息,請參閱 TOP (Transact-SQL)。在整個源表和目標表聯接,且不符合插入、更新或刪除操作條件的聯接行遭刪除后,應用 TOP 子句。 TOP 子句進一步將聯接行數減少到指定值。 這些操作(插入、更新或刪除)以無序方式應用于其余聯接行。 也就是說,在 WHEN 子句中定義的操作中,這些行是無序分布的。 例如,指定 TOP (10) 會影響 10 行。 在這些行中,可能會更新 7 行并插入 3 行,也可能會刪除 1 行、更新 5 行并插入 4 行等。
如果源表上沒有篩選器, MERGE 語句可能會對源表執行表掃描或聚集索引掃描,以及對目標表進行表掃描或聚集索引掃描。 因此,即使使用 TOP 子句通過創建多個批處理來修改大型表,I/O 性能有時也會受到影響。 在這種情況下,請務必要確保所有連續批處理都以新行為目標。
-
database_name
target_table 所在數據庫的名稱。 -
schema_name
target_table 所屬架構的名稱。 -
target_table
<table_source> 中的數據行根據 <clause_search_condition> 進行匹配的表或視圖。 target_table 是由 MERGE 語句的 WHEN 子句指定的任何插入、更新或刪除操作的目標。如果 target_table 為視圖,則針對它的任何操作都必須滿足更新視圖所需的條件。 有關詳細信息,請參閱通過視圖修改數據。
target_table 不得是遠程表。 target_table 不能定義其中的任何規則。target_table 不能是內存優化表。
可以將提示指定為 <merge_hint>。
-
[ AS ] table_alias
用于為 target_table 引用表的替代名稱。 -
USING <table_source>
指定根據 <merge_search_condition> 與 target_table 中的數據行進行匹配的數據源。 此匹配的結果指出了要由 MERGE 語句的 WHEN 子句采取的操作。 <table_source> 可以是一個遠程表,或者是一個能夠訪問遠程表的派生表。<table_source> 可以是一個派生表,它使用 Transact-SQL 表值構造函數通過指定多行來構造表。
-
[ AS ] table_alias
用于為 table_source 引用表的替代名稱。有關此子句的語法和參數的詳細信息,請參閱 FROM (Transact-SQL)。
-
ON <merge_search_condition>
指定聯接 <table_source> 與 target_table 以確定匹配位置所要滿足的條件。注意
請務必僅指定目標表中用于匹配目的的列。 也就是說