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