合并成
适用于:砖的SQL砖运行时
将一组基于源表的更新、插入和删除合并到目标Delta表中。
此语句仅支持Delta Lake表。
语法
合并成target_table_name[target_alias]使用source_table_reference[source_alias]在merge_condition{当匹配[和matched_condition]然后matched_action|当不匹配[通过目标][和not_matched_condition]然后not_matched_action|当不匹配通过源[和not_matched_by_source_condition]然后not_matched_by_source_action}[...]matched_action{删除|更新集*|更新集{列={expr|默认的}}[,...]}not_matched_action{插入*|插入(column1[,...])值(expr|默认的][,...])not_matched_by_source_action{删除|更新集{列={expr|默认的}}[,...]}
参数
一个表名标识正在修改的表。引用的表必须是Delta表。
一个表别名用于目标表。别名不能包含列列表。
一个表名标识要合并到目标表中的源表。
一个表别名对于源表。别名不能包含列列表。
一个关系中的行如何与另一个关系中的行组合。返回类型为BOOLEAN的表达式。
当匹配[和
matched_condition]
当匹配
子句在源行与目标表行匹配时执行merge_condition
还有可选的match_condition
.matched_action
删除
删除匹配的目标表行。
当无条件删除匹配时,允许多个匹配。即使有多个匹配项,无条件删除也不会产生歧义。
更新
更新匹配的目标表行。
若要使用源数据集的相应列更新目标Delta表的所有列,请使用
更新集*
.这相当于更新集col1=source.col1[,col2=source.col2…]
为目标Delta表的所有列。因此,此操作假定源表与目标表中的列相同,否则查询将抛出分析错误。请注意
当启用自动模式迁移时,此行为将更改。看到Delta Lake合并的自动模式演化获取详细信息。
适用于:砖的SQLSQL仓库版本2022.35或更高版本Databricks运行时11.2及以上
你可以指定
默认的
作为expr
显式地将列更新为其默认值。
如果有多个
当匹配
子句,则它们将按照指定的顺序求值。每一个当匹配
从句,除了最后一个,必须有一个matched_condition
.否则,查询返回一个NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION错误。如果没有
当匹配
属性匹配的源和目标行对,条件计算为truemerge_condition
,则目标行保持不变。当不匹配(目标][和
not_matched_condition]
当不匹配
属性的源行与任何目标行不匹配时,子句插入一行merge_condition
还有可选的not_matched_condition
.适用于:Databricks运行时12.1及以上
当不匹配通过目标
可以用作别名当不匹配
.not_matched_condition
必须为布尔表达式。插入*
用源数据集的相应列插入目标Delta表的所有列。这相当于
插入(col1[,col2…)值(source.col1[,source.col2…)
为目标Delta表的所有列。此操作要求源表与目标表中的列具有相同的列。请注意
当启用自动模式迁移时,此行为将更改。看到Delta Lake合并的自动模式演化获取详细信息。
插入(...)值(...)
根据指定的列和相应的表达式生成新行。目标表中的所有列都不需要指定。对于未指定的目标列,将插入默认列,或者
零
如果不存在。适用于:砖的SQLSQL仓库版本2022.35或更高版本Databricks运行时11.2及以上
你可以指定
默认的
作为表达式,显式地为目标列插入默认列。
如果有多个
当不匹配
子句,则它们将按照指定的顺序求值。所有当不匹配
从句,除了最后一个,必须有not_matched_condition
s.否则,查询返回aNON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION错误。当不匹配通过源[和
not_matched_by_source_condition]
适用于:Databricks运行时12.1及以上
当不匹配通过源
属性与源表中的任何行不匹配时,将执行子句merge_condition
还有可选的not_match_by_source_condition
计算结果为true。not_matched_by_source_condition
必须是布尔表达式,仅引用目标表中的列。not_matched_by_source_action
删除
删除目标表行。
更新
更新目标表行。
expr
只能引用目标表中的列,否则查询将抛出分析错误。适用于:砖的SQLSQL仓库版本2022.35或更高版本Databricks运行时11.2及以上
你可以指定
默认的
作为expr
显式地将列更新为其默认值。
重要的
添加一个
当不匹配通过源
属性时更新或删除目标行merge_condition
取值为false可能导致修改大量目标行。如欲获得最佳表现,请申请not_matched_by_source_condition
S来限制更新或删除的目标行数。如果有多个
当不匹配通过源条款
,然后按指定的顺序求值。每一个当不匹配通过源
从句,除了最后一个,必须有一个not_matched_by_source_condition
.否则,查询返回一个NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION错误。如果没有
当不匹配通过源
属性不匹配源表中的任何行的目标行,条件计算为truemerge_condition
,则目标行保持不变。
重要的
一个合并
操作可能失败DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE如果源数据集的多行匹配,并试图更新目标Delta表的同行,则会出现错误。根据merge的SQL语义,这样的更新操作是不明确的,因为不清楚应该使用哪个源行来更新匹配的目标行。可以对源表进行预处理,以消除多个匹配的可能性。看到变更数据捕获示例-它预处理更改数据集(即源数据集),在将更改应用到目标Delta表之前,仅保留每个键的最新更改。
例子
你可以使用合并成
用于复杂的操作,例如重复数据删除、上传更改数据、应用scdtype2操作等。看到使用合并将插入到Delta Lake表举几个例子。
当匹配
——删除源表中有匹配的所有目标行。>合并成目标使用源在目标.关键=源.关键当匹配然后删除——使用源值有条件地更新源表中匹配的目标行。>合并成目标使用源在目标.关键=源.关键当匹配和目标.updated_at<源.updated_at然后更新集*—多个MATCHED子句有条件地删除匹配的目标行,并为所有其他匹配的行更新两列。>合并成目标使用源在目标.关键=源.关键当匹配和目标.marked_for_deletion然后删除当匹配然后更新集目标.updated_at=源.updated_at,目标.价值=默认的
当不匹配(目标]
——插入源表中尚未在目标表中的所有行。使用目标上的源合并到目标。Key = source。关键当不匹配然后插入*-- Conditionally insert new rows in the target table using unmatched rows from the source table. > MERGE INTO target USING source ON target.key = source.key WHEN NOT MATCHED BY TARGET AND source.created_at > now() - INTERVAL “1” DAY THEN INSERT (created_at, value) VALUES (source.created_at, DEFAULT)