- 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句を順序に関係なく指定できます。両方を指定する必要はありません。ただし、少なくともこれらの句のいずれかを指定する必要があります。
- 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文が実行されるときの動作順序は、次のようになります。
- UPDATEアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
- INSERTアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
- MERGE更新指定で指定されたUPDATE操作およびMERGE挿入指定で指定されたINSERT操作が実行されます。
- システムは、指定された制約をチェックします。これによって、参照動作が実行されることがあります。
- UPDATEアクションに関連付けられているすべてのAFTERトリガーが適用されます。
- INSERTアクションに関連付けられているすべてのAFTERトリガーが適用されます。
MERGE WHEN NOT MATCHED (挿入)が先
MERGE文が実行されるときの動作順序は、次のようになります。
- INSERTアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
- UPDATEアクションに関連付けられているすべてのBEFOREトリガーが適用されます。
- MERGE挿入指定で指定されたINSERT操作およびMERGE更新指定で指定されたUPDATE操作が実行されます。
- システムは、指定された制約をチェックします。これによって、参照動作が実行されることがあります。
- INSERTアクションに関連付けられているすべてのAFTERトリガーが適用されます。
- UPDATEアクションに関連付けられているすべてのAFTERトリガーが適用されます。
重複行を含むMERGE
MERGEでは、次のセクションに示すように、UPDATE文と同じ方法で重複するUPDATE行を処理し、INSERT ... SELECTリクエストと同じ方法で重複するINSERT行を処理します。
MERGEでのINSERT重複行
- リクエストに指定されるエラー ログが無く、ターゲット テーブルが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重複行
- リクエストに指定されるエラー ログが無く、ターゲット テーブルがSETテーブルである場合、リクエストはアボートし、ロールバックします。
- リクエストにエラー ログが指定され、ターゲット テーブルはSETテーブルであり、非ローカル エラーがある場合は、リクエストをアボートしてロールバックしますが、MERGEリクエストの完了後または指定されたエラー制限値に到達した後でのみ実行されます。
エラーの原因となる行は、エラー テーブルに記録され、ロールバックされません。
MERGE文のUPDATEソース リレーションでは、重複行を使用できます。
システムは、ターゲット テーブルで行を更新するとき、重複する更新を次のテーブルのように処理します。
セッション モード | システムによる重複する更新の処理 |
---|---|
ANSI | 以下のいずれかの処理を実行します。
|
Teradata | 重複するセットから行を1回更新し、そのセットからの残りのすべての更新を拒否します。 システムは、この状況ではターゲット テーブルで1行だけを更新します。
|