合并成
适用于:砖的SQL砖运行时
合并一组更新、插入和删除源表基于目标三角洲表。
这句话只对三角洲湖表支持。
语法
合并成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|默认的}}(,…]}
参数
一个表名识别表被修改。表必须引用一个三角洲表。
一个表别名目标表。别名必须不包括列清单。
一个表名识别源表合并到目标表。
一个表别名源表。别名必须不包括列清单。
行从一个关系是如何与另一个关联的行相结合。返回类型的布尔表达式。
当匹配(和
matched_condition]
当匹配
条款执行时源行匹配基于目标表行merge_condition
和可选的match_condition
。matched_action
删除
删除匹配的目标表行。
允许多个匹配匹配时无条件删除。无条件删除不是模棱两可的,即使有多个匹配。
更新
更新匹配目标表行。
更新目标三角洲表的所有列的相应列源数据集,使用
更新集*
。这相当于更新集col1=source.col1(,col2=source.col2…]
对所有目标三角洲表的列。因此,这一行动假定源表具有相同的列的目标表,否则查询将抛出一个错误分析。请注意
这种行为变化时自动启用模式迁移。看到自动模式演化为三角洲湖合并获取详细信息。
适用于:砖的SQLSQL仓库2022.35版本或更高版本砖运行时11.2及以上
您可以指定
默认的
作为expr
显式地更新列的默认值。
如果有多个
当匹配
条款,然后他们评估的顺序指定。每一个当匹配
条款,除了最后一个,必须有一个matched_condition
。否则,查询返回一个NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION错误。如果没有一个
当匹配
条件评估为true的源和目标两相匹配的行merge_condition
,然后目标行是不变的。当不匹配(目标](和
not_matched_condition]
当不匹配
条款插入一行,当一个源行不匹配行基于任何目标merge_condition
和可选的not_matched_condition
。适用于:砖的SQL砖运行时12.1及以上
当不匹配通过目标
可以用作一个别名当不匹配
。not_matched_condition
必须是一个布尔表达式。插入*
插入目标三角洲表的所有列的相应列源数据集。这相当于
插入(col1(,col2…)值(source.col1(,source.col2…)
对所有目标三角洲表的列。这个动作需要源表具有相同的列的目标表。请注意
这种行为变化时自动启用模式迁移。看到自动模式演化为三角洲湖合并获取详细信息。
插入(…)值(…)
生成新行根据指定的列和相应的表达式。目标表中的所有列不需要指定。未指定的目标列,列默认插入,或
零
如果没有存在。适用于:砖的SQLSQL仓库2022.35版本或更高版本砖运行时11.2及以上
您可以指定
默认的
作为一个表达式来显式地插入列默认目标列。
如果有多个
当不匹配
条款,然后他们评估的顺序指定。所有当不匹配
条款,除了最后一个,必须有not_matched_condition
年代。否则,查询返回一个NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION错误。当不匹配通过源(和
not_matched_by_source_condition]
适用于:砖的SQL砖运行时12.1及以上
当不匹配通过源
条款执行,当一个目标行不匹配任何根据的源表中的行merge_condition
和可选的not_match_by_source_condition
评估为true。not_matched_by_source_condition
必须是一个布尔表达式,只有引用列的目标表。not_matched_by_source_action
删除
删除目标表行。
更新
更新目标表行。
expr
可能只参考目标表的列,否则查询将抛出一个错误分析。适用于:砖的SQLSQL仓库2022.35版本或更高版本砖运行时11.2及以上
您可以指定
默认的
作为expr
显式地更新列的默认值。
重要的
添加一个
当不匹配通过源
当条款更新或删除目标行merge_condition
评估错误会导致大量的目标行被修改。为获得最佳性能,适用not_matched_by_source_condition
年代限制的数量目标行更新或者删除。如果有多个
当不匹配通过源条款
,然后他们评估的顺序指定。每一个当不匹配通过源
条款,除了最后一个,必须有一个not_matched_by_source_condition
。否则,查询返回一个NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION错误。如果没有一个
当不匹配通过源
条件评估为true的目标行不匹配任何根据的源表中的行merge_condition
,然后目标行是不变的。
重要的
一个合并
操作可以失败DELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE错误如果源数据集的多行匹配并尝试更新相同的目标三角洲表行。根据SQL合并的语义,等更新操作是模棱两可的尚不清楚应该使用哪个源行更新匹配的目标行。源表可以进行预处理来消除多个匹配的可能性。看到变化数据捕获的例子——预处理改变数据集(即源数据集)只保留最新的改变对于每个关键申请前三角洲到目标表。
例子
您可以使用合并成
对于复杂的操作,比如删除数据,插入变化数据,应用SCD 2型操作,等等看插入表使用合并成三角洲湖几个例子。
当匹配
——删除所有目标匹配源表中的行。>合并成目标使用源在目标。关键=源。关键当匹配然后删除——有条件地更新目标行有一个匹配的源表中的使用价值来源。>合并成目标使用源在目标。关键=源。关键当匹配和目标。updated_at<源。updated_at然后更新集*——多个匹配的条款条件删除匹配目标行和更新两列对于所有其他匹配的行。>合并成目标使用源在目标。关键=源。关键当匹配和目标。marked_for_deletion然后删除当匹配然后更新集目标。updated_at=源。updated_at,目标。价值=默认的
当不匹配(目标]
——插入所有行从源中没有目标表。>并入目标使用源代码的目标。关键=来源。关键当不匹配然后插入*-- 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)