合並(Databricks SQL)

基於源表將一組更新、插入和刪除合並到目標增量表中。

此語句僅支持Delta Lake表。

語法

合並target_table_nametarget_alias使用source_table_referencesource_aliasmerge_condition匹配條件然後matched_action...匹配條件然後not_matched_action...matched_action刪除|更新|更新column1value1(,...not_matched_action插入|插入column1(,...value1(,...])

參數

  • target_table_name

    一個表名標識正在修改的表。引用的表必須是Delta表。

  • target_alias

    一個表別名對於目標表。別名不能包含列列表。

  • source_table_reference

    一個表名標識要合並到目標表中的源表。

  • source_alias

    一個表別名對於源表。別名不能包含列列表。

  • merge_condition

    一個關係的行如何與另一個關係的行組合。返回類型為BOOLEAN的表達式。

  • 條件

    一個布爾表達式,必須是真正的來滿足匹配匹配條款。

  • matched_action

    可以有任意數量的匹配而且匹配每個從句,但至少需要一個從句。當匹配被無條件刪除時,允許多個匹配(因為即使有多個匹配,無條件刪除也不會有歧義)。

    • 匹配子句在源行根據匹配條件與目標表行匹配時執行。這些子句具有以下語義。

    • 匹配子句最多隻能有一個更新和一個刪除行動。的更新行動合並隻更新匹配目標行的指定列。的刪除動作將刪除匹配的行。

    • 每一個匹配子句可以有一個可選條件。如果此子句條件存在,則更新刪除隻有當子句條件為真時,才會對任何匹配的源-目標行對行執行操作。

    • 如果有多個匹配子句,然後按照它們被指定的順序對它們求值(也就是說,子句的順序重要)。所有匹配子句,除了最後一個,必須有條件。

    • 如果兩個匹配子句具有條件,並且對於匹配的源-目標行對,兩個條件都不為真,那麼匹配的目標行保持不變。

    • 若要用源數據集的相應列更新目標Delta表的所有列,請使用更新.這相當於更新col1source.col1(,col2source.col2…]用於目標Delta表的所有列。因此,此操作假定源表與目標表中的列相同,否則查詢將拋出分析錯誤。

      當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。

  • 匹配子句在源行根據匹配條件與任何目標行不匹配時執行。這些子句具有以下語義。

    • 匹配分句隻能有插入行動。根據指定的列和相應的表達式生成新行。不需要指定目標表中的所有列。對於未指定的目標列,被插入。

    • 每一個匹配子句可以有一個可選條件。如果子句條件存在,則隻有當該條件為真時才會插入源行。否則,將忽略源行。

    • 如果有多個匹配子句,然後按照它們被指定的順序對它們求值(也就是說,子句的順序重要)。所有匹配子句,除了最後一個,必須有條件。

    • 若要將目標Delta表的所有列與源數據集的相應列插入,請使用插入.這相當於插入(col1(,col2…)(source.col1(,source.col2…)用於目標Delta表的所有列。因此,此操作假定源表與目標表中的列相同,否則查詢將拋出分析錯誤。

      請注意

      當啟用自動模式遷移時,此行為將發生改變。看到自動模式演化獲取詳細信息。

重要的

一個合並如果源數據集的多行匹配,並試圖更新目標Delta表的相同行,則操作可能失敗。根據合並的SQL語義,這樣的更新操作是模糊的,因為它不清楚應該使用哪個源行來更新匹配的目標行。可以對源表進行預處理,以消除多個匹配的可能性。看到更改數據捕獲示例-it對更改數據集(即源數據集)進行預處理,在將更改應用到目標Delta表之前,隻保留每個鍵的最新更改。

例子

您可以使用合並用於複雜的操作,如重複數據刪除、上傳更改數據、應用SCD Type 2操作等。看到合並的例子舉幾個例子。