MERGE INTO
適用対象: Databricks SQL Databricks Runtime
ソース テーブルに基づいて、更新、挿入、および削除のセットをターゲット Delta テーブルにマージします。
このステートメントは、Delta Lake テーブルでのみサポートされます。
このページでは、MERGE
コマンドで正しい構文を使うための詳細について説明します。 MERGE
操作を使ってデータを管理する方法の詳細については、「マージを使用した Delta Lake テーブルへの upsert」を参照してください。
構文
MERGE [ WITH SCHEMA EVOLUTION ] 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 } } [, ...] }
パラメーター
WITH SCHEMA EVOLUTION
適用対象: Databricks Runtime 15.2 以降
この
MERGE
操作のスキーマの自動展開を有効にします。 有効にすると、ターゲット Delta テーブルのスキーマが、ソース テーブルのスキーマと一致するように自動的に更新されます。-
変更するテーブルを識別するテーブル名。 参照されるテーブルは Delta テーブルである必要があります。
この名前には、 options 仕様を含めてはなりません。
テーブルを外部テーブルにすることはできません。
-
ターゲット テーブルのテーブル エイリアス。 別名に列リストを含めることはできません。
-
ターゲット テーブルにマージするソース テーブルを識別するテーブル名。
-
ソース テーブルのテーブルの別名。 別名に列リストを含めることはできません。
-
あるリレーションの行が別のリレーションの行とどのように結合されるか。 戻り値の型がブールの式。
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 ...]
と同等です。 したがって、このアクションでは、ソース テーブルの列がターゲット テーブルと同じであることを前提とします。それ以外の場合、クエリでは分析エラーがスローされます。Note
この動作は、スキーマの自動展開が有効になっている場合に変わります。 詳細については、「Delta Lake マージの自動スキーマの進化」を参照してください。
適用対象: Databricks SQL Databricks Runtime 11.3 LTS 以上
DEFAULT
をexpr
として指定して、列を明示的に既定値に更新できます。
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
に基づいて、ソース行がどのターゲット行にも一致しない場合に行を挿入します。適用対象: Databricks SQL Databricks Runtime 12.2 LTS 以降
WHEN NOT MATCHED BY TARGET
はWHEN NOT MATCHED
をエイリアスとして使用できます。not_matched_condition
はブール式でなければなりません。INSERT *
ソース データセットの対応する列でターゲット Delta テーブルのすべての列を挿入します。 これは、ターゲット Delta テーブルのすべての列に対する
INSERT (col1 [, col2 ...]) VALUES (source.col1 [, source.col2 ...])
と同等です。 この操作では、ソース テーブルにターゲット テーブルの列と同じ列があることが必要です。Note
この動作は、スキーマの自動展開が有効になっている場合に変わります。 詳細については、「Delta Lake マージの自動スキーマの進化」を参照してください。
INSERT ( ... ) VALUES ( ... )
新しい行は、指定された列とそれに対応する式に基づいて生成されます。 ターゲット テーブル内のすべての列を指定する必要はありません。 ターゲット列が指定されていない場合は、列の既定値が挿入され、存在しない場合は
NULL
が挿入されます。適用対象: Databricks SQL Databricks Runtime 11.3 LTS 以上
列の既定値をターゲット列に明示的に挿入する式として
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]
適用対象: Databricks SQL Databricks Runtime 12.2 LTS 以降
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
はターゲット テーブルからの列のみを参照できます。それ以外の場合、クエリは解析エラーをスローします。適用対象: Databricks SQL Databricks Runtime 11.3 LTS 以上
DEFAULT
をexpr
として指定して、列を明示的に既定値に更新できます。
重要
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 と評価されない場合、ターゲット行は変更されません。
重要
MERGE
ON
句とWHEN MATCHED
句で指定された条件に基づいて、ソース テーブル内の複数の行がターゲット テーブル内の同じ行と一致する場合、操作はDELTA_MULTIPLE_SOURCE_ROW_MATCHING_TARGET_ROW_IN_MERGE エラーで失敗します。 マージの SQL セマンティクスによると、この種類の更新操作はあいまいです。これは、一致するターゲット行を更新するためにどのソース行を使用すべきかが不明であるためです。 ソース テーブルを前処理して、複数の一致が発生する可能性をなくすことができます。 change データ キャプチャの例を参照してください。 この例では、変更データセット (ソース データセット) を前処理して、各キーの最新の変更のみを保持してから、その変更をターゲット Delta テーブルに適用します。 Databricks Runtime 15.4 LTS 以下では、 MERGE
は複数の一致を評価する前に、 ON
句の条件のみを考慮します。
例
データの重複除去、変更データのアップサート、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
WITH SCHEMA EVOLUTION
-- Multiple MATCHED and NOT MATCHED clauses with schema evolution enabled.
> MERGE WITH SCHEMA EVOLUTION INTO target USING source
ON source.key = target.key
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
WHEN NOT MATCHED BY SOURCE THEN DELETE