合並成

適用於:檢查標記是的磚的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|默認的}}(,]}

參數

  • target_table_name

    一個表名識別表被修改。表必須引用一個三角洲表。

  • target_alias

    一個表別名目標表。別名必須不包括列清單。

  • source_table_reference

    一個表名識別源表合並到目標表。

  • source_alias

    一個表別名源表。別名必須不包括列清單。

  • merge_condition

    行從一個關係是如何與另一個關聯的行相結合。返回類型的布爾表達式。

  • 匹配(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)

匹配通過

——刪除所有目標行源表中沒有匹配。>合並目標使用目標關鍵=關鍵匹配通過然後刪除——多個源相對應條款條件刪除行和無與倫比的目標更新兩列對於所有其他匹配的行。>合並目標使用目標關鍵=關鍵匹配通過目標marked_for_deletion然後刪除匹配通過然後更新目標價值=默認的