合並成

適用於:勾選“是”磚的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然後刪除匹配通過然後更新目標價值默認的