MERGE文について - Advanced SQL Engine - Teradata Database

Teradata Vantage™ - SQLデータ操作言語

Product
Advanced SQL Engine
Teradata Database
Release Number
17.10
Published
2021年7月
Language
日本語
Last Update
2021-09-23
dita:mapPath
ja-JP/vjt1596846980081.ditamap
dita:ditavalPath
ja-JP/wrg1590696035526.ditaval
dita:id
B035-1146
Product Category
Software
Teradata Vantage
MERGE文は、以下の2つの条件テスト句を持つ単一文にUPDATE文とINSERT文を組み合わせします。
  • WHEN MATCHED, UPDATE
  • WHEN NOT MATCHED, INSERT

MERGE文を使用し、WHEN MATCHED, DELETEを指定して行を削除することもできます。

これらの条件句の意味を次のテーブルで説明します。

Trueと評価する句 MERGEの説明
WHEN MATCHED 一致するターゲット テーブルの行を現在のソース行から取得した一連の値で更新します。

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

WHEN NOT MATCHED 現在のソース行をターゲット テーブルに挿入します。

MERGE文では、1つのWHEN MATCHED句と1つのWHEN NOT MATCHED句を順序に関係なく指定できます。両方を指定する必要はありません。ただし、少なくともこれらの句のいずれかを指定する必要があります。

一致更新と不一致挿入によるAMPマージ ステップは、挿入と更新を1つのステップで実行します。一致更新と不一致挿入によるマージ ステップは、次の操作で実行できます。
  • INSERTのみ
  • UPDATEのみ
  • INSERTとUPDATE

一致削除によるマージは、DELETEのみを実行します。

一致更新と不一致挿入によるマージ ステップでは、ソース テーブルが必ずソース テーブルの結合列で分散され、その結合列は、ON句でターゲット テーブルのプライマリ インデックスに対する等価制約として指定され、RowKeyに格納されます。

このステップは、内部でRowKeyに基づいてマージ結合を実行して、ターゲット行の更新に適合するソース行、および挿入に適合するソース行を特定し、その後更新と挿入を実行します。

このステップは、MERGE操作中にターゲット テーブルのデータ ブロックが1回だけ読み取られて書き込まれるので、MultiLoadのAPPLY句によく似ています。

ソース行をターゲット テーブルに挿入するかどうか、または一致するターゲット テーブルの行をソースから取得した値セットで更新するかどうかを評価する順序は、変化します。結果は、2つの句を指定する順序によって異なります。

MERGE文の処理

この節では、MERGE文によって実行される一般的な動作について説明します。

次のベン図は、集合Aと集合Bという2つの分離した集合にソース テーブルの行を分割しています。集合Aは一致する行のセットであり、集合Bは一致しない行のセットです。



この説明では、以下の条件を使用します。
  • target_table変数は、変更されるターゲット テーブルを指定します。
  • correlation_name変数は、オプションのターゲット テーブルの別名です。
  • USINGキーワードに続くsource_table_name変数は、行が更新操作または削除操作と挿入操作のソースとして機能するソー テーブルを指定します。
  • ONキーワードに続くmatch_condition変数は、ターゲット テーブルの行に一致する行のセットとターゲット テーブルの行に一致しない行のセットにソース テーブルを分割します。

一致する行のセットAは、更新ソースまたは削除ソース(つまり、ステージング)テーブルを定義します。

一致しない行のセットBは、挿入ソース(つまり、ステージング)テーブルを定義します。

MERGE操作でどちらかのセットが空になることはありますが、両方が空になることはできません

システムは、update_column=update_expression変数によって指定されたとおりに、一致する行のセットを更新操作の更新ソース テーブルまたは削除ソース テーブルとして使用します。

システムは、insert_expression変数によって指定されたとおりに、一致しない行のセットを挿入操作の挿入ソース テーブルとして使用します。

トリガーを含むMERGE

MERGE文をMERGE WHEN MATCHED句とともに実行すると、システムはUPDATEまたはDELETE操作に定義されたトリガーを始動します。

MERGE文をMERGE WHEN NOT MATCHED句とともに実行すると、システムはINSERT操作に定義されたトリガーを始動します。

UPDATEトリガーとINSERTトリガーの始動順序は、MERGEリクエストのMERGE WHEN MATCHED句とMERGE WHEN NOT MATCHED句の順序と同じです。

次の操作順序は、複数行のあるソース テーブルに対するMERGE操作に適用されます。すべての場合において、ターゲット テーブルの既存の行の更新、およびターゲット テーブルへの新しい行の挿入が問題なく実行されることを前提とします。

MERGEの操作順序

操作順序は、次のように先に指定しているのがMERGE WHEN MATCHED (更新)句であるか、MERGE WHEN NOT MATCHED (挿入)句であるかによって異なります。

MERGE WHEN MATCHED (更新)が先

MERGE文が実行されるときの動作順序は、次のようになります。

  1. UPDATEアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
  2. INSERTアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
  3. MERGE更新指定で指定されたUPDATE操作およびMERGE挿入指定で指定されたINSERT操作が実行されます。
  4. システムは、指定された制約をチェックします。これによって、参照動作が実行されることがあります。
  5. UPDATEアクションに関連付けられているすべてのAFTERトリガーが適用されます。
  6. INSERTアクションに関連付けられているすべてのAFTERトリガーが適用されます。

MERGE WHEN NOT MATCHED (挿入)が先

MERGE文が実行されるときの動作順序は、次のようになります。

  1. INSERTアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
  2. UPDATEアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
  3. MERGE挿入指定で指定されたINSERT操作およびMERGE更新指定で指定されたUPDATE操作が実行されます。
  4. システムは、指定された制約をチェックします。これによって、参照動作が実行されることがあります。
  5. INSERTアクションに関連付けられているすべてのAFTERトリガーが適用されます。
  6. UPDATEアクションに関連付けられているすべてのAFTERトリガーが適用されます。

重複行を含むMERGE

MERGEでは、次のセクションに示すように、UPDATE文と同じ方法で重複するUPDATE行を処理し、INSERT ... SELECTリクエストと同じ方法で重複するINSERT行を処理します。

MERGEでのINSERT重複行

INSERT操作中にMERGEが重複行を検出すると、データベースは、いくつかの要素に応じてリクエストについて異なる処理を実行します。
  • リクエストに指定されるエラー ログが無く、ターゲット テーブルがSETテーブルで、セッションがANSIセッション モードであると、リクエストはアボートし、ロールバックします。
  • リクエストにエラー ログが指定され、ターゲット テーブルはSETテーブルであり、セッションがANSIセッション モードにある場合、非ローカル エラーがある場合は、リクエストをアボートしてロールバックしますが、MERGEリクエストの完了後または指定されたエラー制限値に到達した後でのみ実行されます。

    エラーの原因となる行は、エラー テーブルに記録され、ロールバックされません

  • ターゲット テーブルはSETテーブルであり、セッションはTeradataセッション モードである場合、重複行は無視されます。

MERGE文のINSERTソース リレーションでは、重複行を使用できません。

INSERT ... SELECT文と同様、MERGEは、Teradataセッション モードでINSERTによるSETテーブルへの重複行の挿入を無視します。

システムがターゲット テーブルに行を挿入するとき、重複行の挿入は、通常の制約チェック ルールによって制御されます。このルールは、セッション モードによって異なります。

セッション モード システムによる重複行の挿入の処理
ANSI ターゲット テーブルに重複行を挿入しません。

重複行を該当するエラー テーブルにエラーとして記録します。

システムは、この状況ではターゲット テーブルに行を挿入ありません

Teradata ターゲット テーブルに重複行の最初の行を挿入し、重複する残りのすべての行をエラーとして記録せずに拒否します。

システムは、この状況ではターゲット テーブルに1行だけを挿入します。

INSERT ... SELECT文とは異なり、MERGEは、Teradataセッション モードでSETテーブルへの重複行の挿入を無視しません

MERGEでのUPDATE重複行

UPDATE操作中にMERGEが重複行を検出した場合、データベースが実行する処理はいくつかの要素に応じて異なります。UPDATE操作の重複行処理は、ANSIセッション モードとTeradataセッション モードで同じです。
  • リクエストに指定されるエラー ログが無く、ターゲット テーブルがSETテーブルである場合、リクエストはアボートし、ロールバックします。
  • リクエストにエラー ログが指定され、ターゲット テーブルはSETテーブルであり、非ローカル エラーがある場合は、リクエストをアボートしてロールバックしますが、MERGEリクエストの完了後または指定されたエラー制限値に到達した後でのみ実行されます。

    エラーの原因となる行は、エラー テーブルに記録され、ロールバックされません

MERGE文のUPDATEソース リレーションでは、重複行を使用できます。

システムは、ターゲット テーブルで行を更新するとき、重複する更新を次のテーブルのように処理します。

セッション モード システムによる重複する更新の処理
ANSI 以下のいずれかの処理を実行します。
  • エラー ロギングが有効である場合、データベースは重複する更新を該当するエラー テーブルにエラーとして記録します。

    つまり、システムは、この状況ではターゲット テーブルの行を1回だけ更新します。

  • エラー ロギングが無効である場合、データベースはリクエストをアボートし、ロールバックします。
Teradata 重複するセットから行を1回更新し、そのセットからの残りのすべての更新を拒否します。

システムは、この状況ではターゲット テーブルで1行だけを更新します。

  • エラー ロギングが有効である場合、データベースは重複する更新を該当するエラー テーブルにエラーとして記録します。

    つまり、システムは、この状況ではターゲット テーブルの行を1回だけ更新します。

  • エラー ロギングが無効である場合、データベースはリクエストをアボートし、ロールバックします。