合並(Databricks SQL)
基於源表將一組更新、插入和刪除合並到目標增量表中。
此語句僅支持Delta Lake表。
語法
合並成target_table_name[target_alias]使用source_table_reference[source_alias]在merge_condition[當匹配[和條件]然後matched_action][...][當不匹配[和條件]然後not_matched_action][...]matched_action{刪除|更新集*|更新集{column1=value1}(,...]}not_matched_action{插入*|插入(column1(,...])值(value1(,...])
參數
一個表名標識正在修改的表。引用的表必須是Delta表。
一個表別名對於目標表。別名不能包含列列表。
一個表名標識要合並到目標表中的源表。
一個表別名對於源表。別名不能包含列列表。
一個關係的行如何與另一個關係的行組合。返回類型為BOOLEAN的表達式。
一個布爾表達式,必須是
真正的
來滿足當匹配
或當不匹配
條款。matched_action
可以有任意數量的
當匹配
而且當不匹配
每個從句,但至少需要一個從句。當匹配被無條件刪除時,允許多個匹配(因為即使有多個匹配,無條件刪除也不會有歧義)。當匹配
子句在源行根據匹配條件與目標表行匹配時執行。這些子句具有以下語義。當匹配
子句最多隻能有一個更新
和一個刪除
行動。的更新
行動合並
隻更新匹配目標行的指定列。的刪除
動作將刪除匹配的行。每一個
當匹配
子句可以有一個可選條件。如果此子句條件存在,則更新
或刪除
隻有當子句條件為真時,才會對任何匹配的源-目標行對行執行操作。如果有多個
當匹配
子句,然後按照它們被指定的順序對它們求值(也就是說,子句的順序重要)。所有當匹配
子句,除了最後一個,必須有條件。如果兩個
當匹配
子句具有條件,並且對於匹配的源-目標行對,兩個條件都不為真,那麼匹配的目標行保持不變。若要用源數據集的相應列更新目標Delta表的所有列,請使用
更新集*
.這相當於更新集col1=source.col1(,col2=source.col2…]
用於目標Delta表的所有列。因此,此操作假定源表與目標表中的列相同,否則查詢將拋出分析錯誤。當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。
當不匹配
子句在源行根據匹配條件與任何目標行不匹配時執行。這些子句具有以下語義。當不匹配
分句隻能有插入
行動。根據指定的列和相應的表達式生成新行。不需要指定目標表中的所有列。對於未指定的目標列,零
被插入。每一個
當不匹配
子句可以有一個可選條件。如果子句條件存在,則隻有當該條件為真時才會插入源行。否則,將忽略源行。如果有多個
當不匹配
子句,然後按照它們被指定的順序對它們求值(也就是說,子句的順序重要)。所有當不匹配
子句,除了最後一個,必須有條件。若要將目標Delta表的所有列與源數據集的相應列插入,請使用
插入*
.這相當於插入(col1(,col2…)值(source.col1(,source.col2…)
用於目標Delta表的所有列。因此,此操作假定源表與目標表中的列相同,否則查詢將拋出分析錯誤。請注意
當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。
重要的
一個合並
如果源數據集的多行匹配,並試圖更新目標Delta表的相同行,則操作可能失敗。根據合並的SQL語義,這樣的更新操作是模糊的,因為它不清楚應該使用哪個源行來更新匹配的目標行。可以對源表進行預處理,以消除多個匹配的可能性。看到更改數據捕獲示例-it對更改數據集(即源數據集)進行預處理,在將更改應用到目標Delta表之前,隻保留每個鍵的最新更改。
例子
您可以使用合並成
用於複雜的操作,如重複數據刪除、上傳更改數據、應用SCD Type 2操作等。看到合並的例子舉幾個例子。