MERGE INTO

適用対象:check marked yes Databricks SQL check marked yes Databricks Runtime

ソース テーブルに基づいて、更新、挿入、および削除のセットをターゲット Delta テーブルにマージします。

このステートメントは、Delta Lake テーブルでのみサポートされます。

このページでは、MERGE コマンドで正しい構文を使うための詳細について説明します。 MERGE 操作を使ってデータを管理する方法の詳細については、「マージを使用した Delta Lake テーブルへの upsert」を参照してください。

構文

MERGE INTO target_table_name [target_alias]
   USING source_table_reference [source_alias]
   ON merge_condition
   { WHEN MATCHED [ AND matched_condition ] THEN matched_action |
     WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition ] THEN not_matched_action |
     WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition ] THEN not_matched_by_source_action } [...]

matched_action
 { DELETE |
   UPDATE SET * |
   UPDATE SET { column = { expr | DEFAULT } } [, ...] }

not_matched_action
 { INSERT * |
   INSERT (column1 [, ...] ) VALUES ( expr | DEFAULT ] [, ...] )

not_matched_by_source_action
 { DELETE |
   UPDATE SET { column = { expr | DEFAULT } } [, ...] }

パラメーター

  • target_table_name

    変更するテーブルを識別するテーブル名。 参照されるテーブルは Delta テーブルである必要があります。

    テーブルを外部テーブルにすることはできません。

  • target_alias

    ターゲット テーブルのテーブルの別名。 別名に列リストを含めることはできません。

  • source_table_reference

    ターゲット テーブルにマージするソース テーブルを識別するテーブル名

  • source_alias

    ソース テーブルのテーブルの別名。 別名に列リストを含めることはできません。

  • ON merge_condition

    あるリレーションの行が別のリレーションの行とどのように結合されるか。 戻り値の型がブールの式。

  • WHEN MATCHED [ AND matched_condition]

    WHEN MATCHED 句は、merge_condition と省略可能な match_condition に基づいてソース行がターゲット テーブル行と一致する場合に実行されます。

  • matched_action

    • DELETE

      一致するターゲット テーブル行を削除します。

      条件指定なしで一致が削除される場合、複数の一致が許容されます。 複数の一致がある場合でも、条件指定なしの削除はあいまいではありません。

    • UPDATE

      一致したターゲット テーブル行を更新します。

      ソース データセットの対応する列で、ターゲット Delta テーブルのすべての列を更新するには、UPDATE SET * を使用します。 これは、ターゲット Delta テーブルのすべての列に対する UPDATE SET col1 = source.col1 [, col2 = source.col2 ...] と同等です。 したがって、このアクションでは、ソース テーブルの列がターゲット テーブルと同じであることを前提とします。それ以外の場合、クエリでは分析エラーがスローされます。

      注意

      この動作は、スキーマの自動移行が有効になっている場合に変わります。 詳細については、「Delta Lake マージの自動スキーマの進化」を参照してください。

      適用対象:check marked yesDatabricks SQL SQL ウェアハウス バージョン 2022.35 以降 check marked yes Databricks Runtime 11.2 以降

      DEFAULTexpr として指定して、列を明示的に既定値に更新できます。

    WHEN MATCHED 句が複数ある場合は、指定された順序で評価されます。 最後の句を除く各 WHEN MATCHED 句には、matched_condition を指定する必要があります。 それ以外の場合、クエリは NON_LAST_MATCHED_CLAUSE_OMIT_CONDITION エラーを返します。

    merge_condition に一致するソースとターゲットの行のペアに対して、どの WHEN MATCHED 条件も true と評価されない場合、ターゲット行はそのままです。

  • WHEN NOT MATCHED [BY TARGET] [ AND not_matched_condition]

    WHEN NOT MATCHED 句は、merge_condition および省略可能な not_matched_condition に基づいて、ソース行がどのターゲット行にも一致しない場合に行を挿入します。

    適用対象:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 以降

    WHEN NOT MATCHED BY TARGETWHEN NOT MATCHED をエイリアスとして使用できます。

    not_matched_condition はブール式でなければなりません。

    • INSERT *

      ソース データセットの対応する列でターゲット Delta テーブルのすべての列を挿入します。 これは、ターゲット Delta テーブルのすべての列に対する INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...]) と同等です。 この操作では、ソース テーブルにターゲット テーブルの列と同じ列があることが必要です。

      注意

      この動作は、スキーマの自動移行が有効になっている場合に変わります。 詳細については、「Delta Lake マージの自動スキーマの進化」を参照してください。

    • INSERT ( ... ) VALUES ( ... )

      新しい行は、指定された列とそれに対応する式に基づいて生成されます。 ターゲット テーブル内のすべての列を指定する必要はありません。 ターゲット列が指定されていない場合は、列の既定値が挿入され、存在しない場合は NULL が挿入されます。

      適用対象:check marked yesDatabricks SQL SQL ウェアハウス バージョン 2022.35 以降 check marked yes Databricks Runtime 11.2 以降

      列の既定値をターゲット列に明示的に挿入する式として DEFAULT を指定できます。

    WHEN NOT MATCHED 句が複数ある場合は、指定された順序で評価されます。 最後のものを除くすべての WHEN NOT MATCHED 句には not_matched_condition が必要です。 それ以外の場合、クエリは NON_LAST_NOT_MATCHED_CLAUSE_OMIT_CONDITION エラーを返します。

  • WHEN NOT MATCHED BY SOURCE [ AND not_matched_by_source_condition]

    適用対象:check marked yes Databricks SQL check marked yes Databricks Runtime 12.1 以降

    WHEN NOT MATCHED BY SOURCE 句は、ターゲット行が に merge_condition 基づいてソース テーブル内のどの行とも一致せず、省略可能な not_match_by_source_condition が true に評価された場合に実行されます。

    not_matched_by_source_condition は、ターゲット テーブルの列のみを参照するブール式である必要があります。

  • not_matched_by_source_action

    • DELETE

      ターゲット テーブル行を削除します。

    • UPDATE

      ターゲット テーブル行を更新します。 expr はターゲット テーブルからの列のみを参照できます。それ以外の場合、クエリは解析エラーをスローします。

      適用対象:check marked yesDatabricks SQL SQL ウェアハウス バージョン 2022.35 以降 check marked yes Databricks Runtime 11.2 以降

      DEFAULTexpr として指定して、列を明示的に既定値に更新できます。

    重要

    merge_conditionが false に評価するときに ターゲット行を更新または削除するWHEN NOT MATCHED BY SOURCE 句を追加すると、多数のターゲット行が変更される可能性があります。 最適なパフォーマンスを得るには、 not_matched_by_source_conditionを適用して、更新または削除されたターゲット行の数を制限します。

    WHEN NOT MATCHED BY SOURCE clausesが複数ある場合は、指定された順序で評価されます。 最後の句を除く各 WHEN NOT MATCHED BY SOURCE 句には、not_matched_by_source_condition を指定する必要があります。 それ以外の場合、クエリは NON_LAST_NOT_MATCHED_BY_SOURCE_CLAUSE_OMIT_CONDITION エラーを返します。

    merge_conditionに基づいてソース テーブル内の行と一致しないターゲット行に対してどのWHEN NOT MATCHED BY SOURCE条件も true と評価されない場合、ターゲット行は変更されません。

重要

ソース データセットの複数の行が一致し、ターゲット Delta テーブルの同じ行を更新しようとすると、MERGE 操作がDELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGEのエラーで失敗する可能性があります。 マージの SQL セマンティクスによると、このような更新操作はあいまいです。一致するターゲット行を更新するために使用するソース行が明確でないためです。 ソース テーブルを前処理して、複数の一致が発生する可能性をなくすことができます。 変更データ キャプチャの例を参照してください。ここには、変更データセット (つまり、ソース データセット) を前処理して、ターゲット Delta テーブルに変更を適用する前に、各キーの最新の変更のみを保持する方法が示されています。

データの重複除去、変更データのアップサート、SCD タイプ 2 の操作の適用などの複雑な操作に MERGE INTO を使用できます。いくつかの例については、「マージを使用するDelta Lakeテーブルにアップサートする」を参照してください。

WHEN MATCHED

-- Delete all target rows that have a match in the source table.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN MATCHED THEN DELETE

-- Conditionally update target rows that have a match in the source table using the source value.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN MATCHED AND target.updated_at < source.updated_at THEN UPDATE SET *

-- Multiple MATCHED clauses conditionally deleting matched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN MATCHED AND target.marked_for_deletion THEN DELETE
  WHEN MATCHED THEN UPDATE SET target.updated_at = source.updated_at, target.value = DEFAULT

WHEN NOT MATCHED [BY TARGET]

-- Insert all rows from the source that are not already in the target table.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN NOT MATCHED THEN INSERT *

-- 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)

WHEN NOT MATCHED BY SOURCE

-- Delete all target rows that have no matches in the source table.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN NOT MATCHED BY SOURCE THEN DELETE

-- Multiple NOT MATCHED BY SOURCE clauses conditionally deleting unmatched target rows and updating two columns for all other matched rows.
> MERGE INTO target USING source
  ON target.key = source.key
  WHEN NOT MATCHED BY SOURCE AND target.marked_for_deletion THEN DELETE
  WHEN NOT MATCHED BY SOURCE THEN UPDATE SET target.value = DEFAULT