在 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 以确定匹配位置所要满足的条件。注意
请务必仅指定目标表中用于匹配目的的列。 也就是说