合並成
適用於:磚的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)