合并成

适用于:勾选“是”砖的SQL勾选“是”砖运行时

将一组基于源表的更新、插入和删除合并到目标Delta表中。

此语句仅支持Delta Lake表。

语法

合并target_table_nametarget_alias使用source_table_referencesource_aliasmerge_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|默认的[,...

参数

  • target_table_name

    一个表名标识正在修改的表。引用的表必须是Delta表。

  • target_alias

    一个表别名用于目标表。别名不能包含列列表。

  • source_table_reference

    一个表名标识要合并到目标表中的源表。

  • source_alias

    一个表别名对于源表。别名不能包含列列表。

  • merge_condition

    一个关系中的行如何与另一个关系中的行组合。返回类型为BOOLEAN的表达式。

  • 匹配matched_condition

    匹配子句在源行与目标表行匹配时执行merge_condition还有可选的match_condition

  • matched_action

    • 删除

      删除匹配的目标表行。

      当无条件删除匹配时,允许多个匹配。即使有多个匹配项,无条件删除也不会产生歧义。

    • 更新

      更新匹配的目标表行。

      若要使用源数据集的相应列更新目标Delta表的所有列,请使用更新*.这相当于更新col1source.col1[,col2source.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_conditions.否则,查询返回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_conditionS来限制更新或删除的目标行数。

    如果有多个匹配通过条款,然后按指定的顺序求值。每一个匹配通过从句,除了最后一个,必须有一个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_atupdated_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)

匹配通过

——删除源表中没有匹配的所有目标行。>合并目标使用目标关键关键匹配通过然后删除—多个NOT MATCHED BY SOURCE子句有条件地删除不匹配的目标行,并为所有其他匹配的行更新两列。>合并目标使用目标关键关键匹配通过目标marked_for_deletion然后删除匹配通过然后更新目标价值默认的