MERGE

MERGE ステートメントは、ソース (表参照の結果) のデータを使用してターゲット (表またはビュー) を更新します。入力データと一致する行がターゲットに存在する場合は、その行を指定内容に基づいて更新/削除できます。ターゲットに存在しない行を指定内容に基づいて挿入することも可能です。 ビューの行を更新/削除/挿入すると、そのビューで INSTEAD OF トリガーが定義されていない限り、ビューの基本表の行も更新/削除/挿入されます。

呼び出し

このステートメントは、アプリケーション・プログラムに組み込むことも、 あるいは対話式に実行することもできます。 これは、動的に準備できる実行可能ステートメントです。このステートメントは、REXX プロシージャーでは使用できません。

権限

このステートメントの権限 ID が保持する特権には、少なくとも以下の 1 つ が含まれていなければなりません。

  • データベース管理者権限
  • 挿入操作を指定する場合は、以下のようになります。
    • その表やビューについての INSERT 特権、および
    • 表またはビューが含まれるスキーマに対する USAGE 特権
  • 削除操作を指定する場合は、以下のようになります。
    • その表またはビューに対する DELETE 特権
    • 表またはビューが含まれるスキーマに対する USAGE 特権
  • 更新操作を指定する場合は、以下のようになります。
    • 表やビューに対する UPDATE 特権、または
    • 更新される各列に対する UPDATE 特権、または
    • 表またはビューが含まれるスキーマに対する USAGE 特権

さらに、search-conditioninsert-operationassignment-clause のいずれかに全選択を組み込む場合は、ステートメントの権限 ID の特権に少なくとも以下のいずれか 1 つの権限が含まれていなければなりません。

  • 全選択 内で識別された、それぞれの表またはビューごとに、
    • 表やビューに対する SELECT 特権、および
    • 表またはビューが含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

さらに、表またはビューの列を参照する照会を table-reference に組み込む場合は、ステートメントの権限 ID の特権に少なくとも以下のいずれか 1 つの権限が含まれていなければなりません。

  • 全選択 内で識別された、それぞれの表またはビューごとに、
    • 表やビューに対する SELECT 特権、および
    • 表またはビューが含まれるスキーマに対する USAGE 特権
  • データベース管理者権限

SQL 特権に対応するシステム権限については、『表またはビューへの権限を検査する際の対応するシステム権限』を参照してください。

構文

構文図を読む構文図をスキップする
>>-MERGE INTO--+-table-name-+--+--------------------+----------->
               '-view-name--'  '-correlation-clause-'   

>--USING--table-reference--ON--search-condition----------------->

   .------------------------------------------------------.   
   V                                                      |   
>----WHEN--matching-condition--THEN--+-update-operation-+-+----->
                                     +-delete-operation-+     
                                     +-insert-operation-+     
                                     '-signal-statement-'     

   .-ELSE IGNORE-.   
>--+-------------+---------------------------------------------->

   .-ATOMIC-----------------------------------.   
>--+------------------------------------------+----------------->
   '-NOT ATOMIC--+-STOP ON SQLEXCEPTION-----+-'   
                 '-CONTINUE ON SQLEXCEPTION-'     

   .-----------------------------------------.   
   V                                         |   
>----+-------------------------------------+-+-----------------><
     +-isolation-clause--------------------+     
     '-concurrent-access-resolution-clause-'     

correlation-clause

   .-AS-.                                                
|--+----+--correlation-name--+-----------------------+----------|
                             |    .-,-----------.    |   
                             |    V             |    |   
                             '-(----column-name-+--)-'   

matching-condition

|--+-----+--MATCHED--+-----------------------+------------------|
   '-NOT-'           '-AND--search-condition-'   

update-operation

|--UPDATE--+-------------------------+--SET--assignment-clause--|
           +-OVERRIDING SYSTEM VALUE-+                           
           '-OVERRIDING USER VALUE---'                           

delete-operation

|--DELETE-------------------------------------------------------|

insert-operation

|--INSERT--+-----------------------+--+-------------------------+-->
           |    .-,-----------.    |  +-OVERRIDING SYSTEM VALUE-+   
           |    V             |    |  '-OVERRIDING USER VALUE---'   
           '-(----column-name-+--)-'                                

>--VALUES--+-+-expression-+-----------+-------------------------|
           | +-DEFAULT----+           |   
           | '-NULL-------'           |   
           |    .-,--------------.    |   
           |    V                |    |   
           '-(----+-expression-+-+--)-'   
                  +-DEFAULT----+          
                  '-NULL-------'          

 割り当て文節

     .-,----------------------------------------------------------.     
     V                                                            |     
|--+---+-column-name--=--+-expression-+-------------------------+-+-+--|
   |   |                 +-DEFAULT----+                         |   |   
   |   |                 '-NULL-------'                         |   |   
   |   |    .-,-----------.             .-,--------------.      |   |   
   |   |    V             |             V                |      |   |   
   |   '-(----column-name-+--)--=--(--+---+-expression-+-+-+--)-'   |   
   |                                  |   +-DEFAULT----+   |        |   
   |                                  |   '-NULL-------'   |        |   
   |                                  '-row-fullselect-----'        |   
   |              .-,--------------.                                |   
   |              V                |                                |   
   '-ROW--=--(--+---+-expression-+-+-+--)---------------------------'   
                |   +-DEFAULT----+   |                                  
                |   '-NULL-------'   |                                  
                '-row-fullselect-----'                                  

isolation-clause

|--WITH--+-NC-+-------------------------------------------------|
         +-UR-+   
         +-CS-+   
         +-RS-+   
         '-RR-'   

説明

table-name または view-name
マージの更新、挿入、削除の操作のターゲットを指定します。この名前は、現行サーバーに存在する表またはビューを示していなければなりませんが、カタログ表、カタログ表のビュー、読み取り専用ビュー、または、ビューに対して定義された INSTEAD OF トリガーに無関係の削除不能ビューを示すものであってはなりません。table-name が履歴表を識別する場合、MERGE ステートメントに更新操作および挿入操作を指定することはできません。
AS correlation-name
検索条件マッチング条件 の中で、または割り当て文節 の右側で、ターゲット表またはビューを指定するために使用できます。表またはビューの列に対する参照を修飾するためには、correlation-name を使用します。相関名 を指定する場合は、列名 も同時に指定することによって、表名 またはビュー名 の列に名前を指定することができます。列リストを指定する場合は、その列リストの中で、表またはビューの各列について、それぞれ名前を指定する必要があります。詳しくは、相関名を参照してください。
USING table-reference
ターゲットにマージする結果表として行のセットを指定します。結果表が空の場合、警告が戻されます。
ON search-condition
ソース表 からの行とターゲット表の行が一致するかどうかを判定するために使用される述部を指定します。

search-condition に組み込む各 column-name では、ターゲット表またはターゲット・ビューまたは table-reference の列名を指定しなければなりません (ただし、副照会の内部は除きます)。 検索条件に副照会を組み込む場合に、マージとその副照会の基本オブジェクトが同じ表であれば、行の更新/挿入操作が実行される前にその副照会が完全に評価されます。

search-condition は、ターゲット表と table-reference の結果表の各行に適用されます。 table-reference の結果表の行のうち、search-condition の結果が真になった行では、指定した更新/削除操作が実行されます。結果表の行のうち、search-condition の結果が真にならなかった行では、指定した挿入操作が実行されます。

定量副照会、副選択を入れた IN 述部、EXISTS 副照会を search-condition に組み込むことはできません。 基本述部副照会またはスカラー全選択は含めることができます。集約関数または非決定的なスカラー関数を使用した式を組み込むこともできません。

WHEN matching-condition
update-operationdelete-operationinsert-operation、 または signal-statement が実行される条件を指定します。それぞれの matching-condition は、指定順で評価されます。matching-condition の評価が真になった行は、その後のマッチング条件の対象になりません。
MATCHED
ON search-condition が真になった行で実行する操作を指定します。THEN の後に指定できるのは、UPDATE、DELETE、signal-statement に限られます。
AND search-condition
THEN の後に指定する操作の実行に関する ON 検索条件に合致した行に適用する追加の検索条件を指定します。

検索条件 には、EXISTS または IN 述部に副照会を組み込むことはできません。

NOT MATCHED
ON search-condition が偽または不明になった行で実行する操作を指定します。THEN の後に指定できるのは、INSERT または signal-statement に限られます。
AND search-condition
THEN の後に指定する操作の実行に関する ON 検索条件に合致しなかった行に適用する追加の検索条件を指定します。

検索条件 には、EXISTS または IN 述部に副照会を組み込むことはできません。

THEN
マッチング条件 が真と評価された時に実行する操作を指定します。
update-operation
matching-condition の評価が真になった行で実行する更新操作を指定します。
assignment-clause
列の更新情報のリストを指定します。
column-name
更新する列を識別します。column-name では、ターゲット表またはターゲット・ビューの列を指定する必要があります。スカラー関数、定数、式から派生するビューの列を column-name で指定することはできません。列名を複数回指定することはできません。

1 つのビューに同じ列から得られる 2 つの列がある場合、その列の値を更新することは可能ですが、その 2 つの列を同一の MERGE ステートメントで更新することはできません。

ROW
ターゲット表またはビューのすべての列 (ただし、隠し属性を指定して定義された列以外) を識別します。ビューが指定されている場合、 そのビューの列がまったく、スカラー関数、定数、または式から派生していない場合があります。
式、NULL、および DEFAULT の数 (または row-fullselect の結果列の数) は、行の列の数と一致していなければなりません。
ビューに、そのビューの別の列から派生したビュー列が含まれている場合、そのビューに ROW を指定することはできません。これは、両方の列を同じ UPDATE 内で更新できないためです。
expression
列の新しい値を示します。この式の中で集約関数 を指定することはできません (ただし、集約関数がスカラー全選択の 中にある場合を除きます)

ターゲットの table-name または view-name の列に対する参照をこの式に組み込むこともできます。更新する行ごとに、式に組み込むターゲット列の参照の値として、行の更新前の列の値を指定します。

expression がソース表の単一の列への参照である場合、ソース表の列の値は、拡張標識変数の値で指定された可能性があります。 そのような標識変数は、assignment-clause の対応するターゲット列に影響を与えます。

拡張標識変数が使用可能であり、式が以下の参照よりも複雑な場合には、拡張標識変数の 値 DEFAULT (-5) または UNASSIGNED (-7) を使用してはなりません。
  • ソース表の単一の列
  • 単一のホスト変数
DEFAULT
列にデフォルト値を割り当てるように指定します。DEFAULT は、デフォルト値のある列のみに対して指定できます。デフォルト値 について詳しくは、CREATE TABLE の DEFAULT 節の説明を参照してください。

ユーザー指定の値をすべて無視 して固有のシステム生成値を使用するよう指示する OVERRIDING USER VALUE が 指定されていない場合、GENERATED ALWAYS として定義された列には DEFAULT を指定する必要があります。GENERATED BY DEFAULT として定義される列に関しては、有効な値を指定することができます。

NULL
列の新しい値に NULL 値を指定します。NULL 可能列にのみ NULL を指定します。
delete-operation
matching-condition の評価が真になった行で実行する削除操作を指定します。
insert-operation
matching-condition の評価が真になった行で実行する挿入操作を指定します。
INSERT
挿入操作で使用する列名と行値式のリストの前に記述します。
行値式にある値の数は、暗黙的または明示的な挿入列リストに含まれている 名前の数と同じでなければなりません。リストの最初の列には VALUES 文節の最初の値が挿入され、 リストの 2 番目の列には VALUES 文節の 2 番目の値が挿入されるというように、 指定した列に対応する値が順に挿入されます。
(column-name,…)
値を挿入する列を指定します。 それぞれの名前は、表またはビューの列を識別する名前でなければなりません。 同じ列を複数回指定することはできません。 拡張標識変数が使用できないと、更新不可能なビュー列を識別することはできません。拡張標識変数が使用できず、挿入操作の対象となるビューに上記のような列がある場合は、列名のリストを指定しなければなりません。 この列名のリストから、値を挿入できない列の名前を除外する必要があります。 ビュー内の更新可能な列の説明については、CREATE VIEWを参照してください。

列名のリストを指定しなかった場合は、該当する表またはビューにあるすべての列を左から右の順序で指定したものと見なされます。 隠し属性で定義されたすべての列が省略されます。このリストは、ステートメントを準備するときに確立されるので、ステートメントを準備した後で表に追加した列をリストに指定してはなりません。

VALUES
挿入する新しい行を指定します。

この節の 各変数は、変数宣言規則に従って宣言された変数を示していなければ なりません。ホスト構造は使用できません。変数について詳しくは、ホスト変数に対する参照を参照してください。

expression
集約関数または列名を含まない、で説明されているタイプの expression
拡張標識変数が使用可能であり、式が以下の参照よりも複雑な場合には、拡張標識変数の 値 DEFAULT (-5) または UNASSIGNED (-7) を使用してはなりません。
  • ソース表の単一の列
  • 単一のホスト変数
  • 明示的にキャストされるホスト変数
DEFAULT
列にデフォルト値を割り当てるように指定します。DEFAULT は、デフォルト値のある列のみに対して指定できます。デフォルト値 について詳しくは、CREATE TABLE の DEFAULT 節の説明を参照してください。

ユーザー指定の値をすべて無視 して固有のシステム生成値を使用するよう指示する OVERRIDING USER VALUE が 指定されていない場合、GENERATED ALWAYS として定義された列には DEFAULT を指定する必要があります。GENERATED BY DEFAULT として定義される列に関しては、有効な値を指定することができます。

NULL
列の値を NULL 値にすることを指定します。NULL は、NULL 可能列にのみ指定してください。
OVERRIDING SYSTEM VALUE または OVERRIDING USER VALUE
ROWID、識別、または行変更タイム・スタンプ列に、システムが生成した値やユーザーが指定した値を使用するかどうかを指定します。OVERRIDING SYSTEM VALUE を指定する場合は、INSERT の暗黙的または明示的な列リストまたは UPDATE の SET 文節に、GENERATED ALWAYS として定義された ROWID 列、ID 列、または行変更タイム・スタンプ列が含まれていることが必要です。 OVERRIDING USER VALUE を指定する場合は、INSERT の暗黙的または明示的な列リストまたは UPDATE の SET 文節に、GENERATED ALWAYS または GENERATED BY DEFAULT として定義されている列を組み込む必要があります。
OVERRIDING SYSTEM VALUE
GENERATED ALWAYS として定義されている列について、VALUES または SET 文節に指定されている値を使用することを指定します。システム生成の値は使用されません。
行開始列、行終了列、トランザクション開始 ID 列、または生成式列の値が提供された場合、 それは DEFAULT でなければなりません。
OVERRIDING USER VALUE
GENERATED ALWAYS または GENERATED BY DEFAULT として定義されている列について、VALUES または SET 文節に指定されている値を無視することを指定します。代わりにシステム生成の値が使用され、ユーザー指定の値はオーバーライドされます。

OVERRIDING SYSTEM VALUE と OVERRIDING USER VALUE のどちらも指定し ない場合は、以下のようになります。

  • GENERATED ALWAYS として定義された ROWID 列、ID 列、行変更タイム・スタンプ列、行開始列、行終了列、トランザクション開始 ID 列、 および生成式列に、値を指定することはできません。
  • GENERATED BY DEFAULT として定義された ROWID、識別、または行変更タイム・スタンプ列には、値を指定することができます。値を指定した場合は、この列にその値が割り当てられます。 ただし、BY DEFAULT として定義された ROWID 列に値を割り当てることができるのは、指定された値が、Db2® for z/OS® または Db2 for i によって既に生成されている有効な行 ID 値である場合のみです。BY DEFAULT として定義された識別または行変更タイム・スタンプ列に値を挿入または更新した場合は、その識別または行変更タイム・スタンプ列が固有制約または固有索引内の唯一のキーである場合以外は、データベース・マネージャーはその指定された値が該当の列についての固有な値であるかどうかを検査しません。固有制約も固有索引もない場合は、データベース・マネージャーは、NO CYCLE が有効である 場合に限り、システム生成の値のセットの中でのみ各値の固有性を保証します。

    値が指定されていない場合は、データベース・マネージャーは新しい値を生成します。

signal-statement
matching-condition の評価が真になったときにエラーを返すために実行する SIGNAL ステートメントを指定します。SIGNALを参照してください。
ELSE IGNORE
USING table-reference の行ですべての WHEN 文節の matching-condition が偽になった場合に何の操作も実行しない、という動作を指定します。 その場合は、ELSE IGNORE を指定したかどうかにかかわりなく、何の操作も実行されません。
ATOMIC または NOT ATOMIC
エラーを処理する方法を指定します。
ATOMIC
update-operationdelete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメント全体をロールバックする、という動作を指定します。
NOT ATOMIC
update-operationdelete-operation、 または insert-operation の実行中にエラーが発生した場合に、その update-operationdelete-operation、 または insert-operation のみがロールバックされることを指定します。
STOP ON SQL EXCEPTION
update-operationdelete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメントの処理を停止する、という動作を指定します。
CONTINUE ON SQL EXCEPTION
update-operationdelete-operation、 または insert-operation の実行中にエラーが発生した場合に MERGE ステートメントの処理を続行する、という動作を指定します。
isolation-clause
このステートメントに関して使用する分離レベルを指定します。
WITH
分離レベルを指定します。次のいずれかになります。
  • RR 反復可能読み取り
  • RS 読み取り固定
  • CS カーソル固定
  • UR 非コミット読み取り
  • NC コミットなし
ISOLATION 文節 を指定しなかった場合は、デフォルトの分離レベルが使用されます。 デフォルトの判別方法については、ISOLATION 文節を参照してください。
concurrent-access-resolution-clause
SELECT ステートメントで使用する並行アクセスの解決方法を指定します。詳しくは、concurrent-access-resolution-clauseを参照してください。

MERGE の規則

  • 単一の MERGE ステートメントに、複数の update-operationdelete-operationinsert-operation、または signal-statement を 指定できます。
  • ターゲットの各行を操作できるのは、1 回に限られます。ターゲットの行は、table-reference の結果表の 1 つの行に対してのみ MATCHED として評価されます。ネストした SQL 操作 (INSTEAD OF トリガー以外のトリガーまたは RI) で、UPDATE、DELETE、INSERT、MERGE の各ステートメントのターゲットとして、ターゲット表 (または同じ階層にある表) を指定することはできません。
MERGE ステートメントの更新、挿入、削除の部分に当てはまる他の規則については、それぞれ対応するステートメントの『規則』のセクションにある説明を参照してください。

拡張標識変数の使用: 使用可能な場合は、正の値および 0 (ゼロ) から -7 以外の標識変数値を設定しないでください。 DEFAULT および UNASSIGNED 拡張標識変数値を、それらがサポートされていないコンテキストに指定しないでください。

拡張標識変数: MERGE ステートメントの挿入部分で、 拡張標識変数値 UNASSIGNED は、列をデフォルト値に設定する 効果があります。

MERGE 制約事項: MERGE ステートメント のターゲット表にトリガーがあるか、または、ターゲット表が参照整合性制約における親である場合、 update-operation または insert-operation に、グローバル変数、 関数、または副選択が含まれていてはなりません。

処理の論理順序: NOT ATOMIC の MERGE ステートメントの場合は、各ソース行がそれぞれ別個に処理されます。つまり、各ソース行で別々の MERGE ステートメントが実行されるような動作になります。 例えば、ターゲット行の更新を引き起こすソース行は、行の更新が実行されるときに、トリガー (ステートメント・レベルのトリガーを含む) を起動します。したがって、5 つの行が更新されるとすれば、UPDATE トリガー (ステートメント・レベルの UPDATE トリガーを含む) が 5 回起動されます。

ATOMIC の MERGE ステートメントの場合は、ソース行がまとめて処理されます。つまり、それぞれの WHEN 文節で 1 セットの行が処理されるような動作になります。例えば、5 つの行が更新されるとすれば、行レベルの UPDATE トリガーが 5 回起動されますが、ステートメント・レベルの UPDATE トリガーが起動されるのは、n 個になります (n は、UPDATE が含まれている WHEN 文節の数です。ソース行を処理しなかった UPDATE が含まれている WHEN 文節もその数に入ります)。ATOMIC の MERGE の処理の論理順序を以下にまとめます。
  1. 1 つのセットとしてまとめて処理する行をソースとターゲットから判別します。このステートメントで特殊レジスターの CURRENT DATE、CURRENT TIME、CURRENT TIMESTAMP のいずれかを使用する場合は、ステートメント全体でクロックの読み取りが 1 回だけ発生します。
  2. ON 文節を使用して、それらの行を MATCHED または NOT MATCHED のいずれかとして分類します。
  3. WHEN 文節に含まれている matching-condition を評価します。
  4. assignment-clauseinsert-operation に含まれている式を評価します。
  5. それぞれの signal-statement を実行します。
  6. 指定された順序に従って、 それぞれの update-operationdelete-operation、 または insert-operation を該当する行に適用します。 それぞれの update-operationdelete-operation、または insert-operation によってアクティブにされたトリガーが実行されます。ステートメント・レベルのトリガーは、update-operationdelete-operation、 または insert-operation の基準を満たす行がない場合でもアクティブになります。 それぞれの update-operationdelete-operation、 または insert-operation は、 後続のそれぞれの update-operationdelete-operation、 または insert-operation のトリガーに影響する可能性があります。

更新行の数: MERGE ステートメントの実行後、SQL 診断域の ROW_COUNT ステートメント情報項目 (または SQLCA の SQLERRD(3)) には、MERGE ステートメントによって操作された行の数が入ります (ただし、ELSE IGNORE 文節の対象になった行は除外されます)。ROW_COUNT 項目と SQLERRD(3) には、トリガーの結果として操作された行の数は含まれません。DB2_ROW_COUNT_SECONDARY ステートメント情報項目 (または SQLCA の SQLERRD(5)) の値には、それらの行の数が含まれています。

ROW_COUNT および DB2_ROW_COUNT_SECONDARY についての説明は、GET DIAGNOSTICSを参照してください。SQLCA についての説明は、SQLCA (SQL 連絡域)を参照してください。

GET DIAGNOSTICS に関する注意点: MERGE ステートメントの完了時に 1 つ以上のエラーが発生している場合は、MERGE ステートメントの実行後に GET DIAGNOSTICS ステートメントを使用して、どの入力行でエラーが発生したのかを確認できます。GET DIAGNOSTICS のステートメント情報項目 NUMBER には、MERGE ステートメントの実行時に検出された条件 (エラーまたは警告) の数が入ります。さらに、GET DIAGNOSTICS の条件情報項目 DB2_ROW_NUMBER では、それぞれの条件ごとに、エラーの原因になった入力ソース行を確認できます。

挿入行の更新はできない: MERGE ステートメントの実行前に存在しなかったターゲット行 (つまり、MERGE ステートメントによって挿入された行) を更新することはできません。

MERGE のターゲット行の並行変更: MERGE 処理では、update-operationsdelete-operations、 または insert-operations の実行前に、MERGE で影響を受けるターゲット行が確認されます。制限の強い分離レベル (反復可能読み取りなど) を使用する場合を除き、影響を受ける一連のターゲット行が確認されてから、特定の行の update-operationdelete-operation、または insert-operation が処理されるまでの間に、並行処理によって MERGE のターゲット行が挿入/変更されることもあり得ます。そのような並行アクティビティーが発生すると、エラーになる可能性があります。例えば、MERGE 処理で、ソース行がターゲットに存在しない、という状況が確認されたとします。ターゲットでは、1 つの列の値にユニーク・キー制約がかかっています。MERGE がソース・データに基づいて新しい行を挿入しようとする前に、並行処理が同じキー値で行を挿入してしまう可能性があります。そのような状態で MERGE 処理がその行を挿入しようとすると、重複キー・エラーが発生します。

ロッキング: COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、 または COMMIT(*CHG) が指定されている場合は、正常に実行される MERGE ステートメントの実行中に、 1 つまたは複数の排他的ロックが掛けられます。 そのようなロックがコミットまたはロールバック操作によって解放されるまで、挿入または更新された行は、以下によってのみアクセスすることができます。

  • 挿入または更新を行ったアプリケーション・プロセス
  • 読み取り専用操作を介して、COMMIT(*NONE) または COMMIT(*CHG) を使用する別のアプリケーション・プロセス

ロックは、他のアプリケーション・プロセスがその表の操作を行うのを防止します。 ロッキングの詳細については、COMMITROLLBACK、および LOCK TABLE ステートメントの説明を参照してください。 また、分離レベルおよび「データベース・プログラミング」も参照してください。

COMMIT(*RR)、COMMIT(*ALL)、COMMIT(*CS)、または COMMIT(*CHG) を指定した場合は、1 つの MERGE ステートメントで最高 500 000 000 行を獲得することができます。行ロックの数には、MERGE のターゲットで挿入/更新/削除された行と、トリガーの結果として同じコミットメント定義で挿入/更新/削除された行が含まれます。 さらに、COMMIT(*ALL) を指定した場合は、USING table-reference で参照されているソース行も行ロックの数に含まれます。

アクティブな行および列アクセス制御がある表: 使用可能な行の許可と列マスクが、MERGE ステートメント内の更新操作や挿入操作にどのように影響を及ぼすかについては、INSERT ステートメントと UPDATE ステートメントの情報を参照してください。

NOT ATOMIC の処理: NOT ATOMIC を指定した場合は、ソース・データ行が別々に処理されます。MERGE ステートメントで特殊レジスター (CURRENT TIMESTAMP など) を参照した場合は、ソース・データの各行が処理されるたびにその参照が評価されます。ステートメント・レベルのトリガーもソース・データの各行の処理時に活動化されます。

ソース・データの行の操作中にエラーが発生すると、そのエラーの時点で処理の対象になっていた行は、挿入/更新/削除されません。 個々の行の処理はアトミック・オペレーションになります。MERGE ステートメントの処理で既に実行された他の変更は、ロールバックされません。CONTINUE ON EXCEPTION を指定した場合は、次の行に移って実行処理が続行されます。

システム期間テンポラル表: システム期間テンポラル表に関する MERGE ステートメントが処理される場合、行は特定のデータ変更操作が呼び出された場合と同様に影響を受けます。

例 1: アクティビティーの説明が変更されていた場合は、アーカイブ表でその説明を更新します。新しいアクティビティーがあれば、アーカイブ表にそのアクティビティーを挿入します。アーカイブ表でもアクティビティー表でも、アクティビティーが主キーになっています。
MERGE INTO archive ar
  USING (SELECT activity, description FROM activities) ac
  ON (ar.activity = ac.activity)
  WHEN MATCHED THEN 
    UPDATE SET description = ac.description
  WHEN NOT MATCHED THEN
    INSERT (activity, description) VALUES(ac.activity, ac.description)
例 2: 出荷表を使用して、在庫表に行をマージします。行が一致した場合は、出荷表の部品数の分だけ数量を増やします。そうでない場合は、新しい partno を在庫表に挿入します。
MERGE INTO inventory AS in
  USING (SELECT partno, description, count FROM shipment
           WHERE shipment.partno IS NOT NULL) AS sh
  ON (in.partno = sh.partno)
  WHEN MATCHED THEN 
    UPDATE SET description = sh.description,
               quantity = in.quantity + sh.count
  WHEN NOT MATCHED THEN
    INSERT (partno, description, quantity)
           VALUES (sh.partno, sh.description, sh.count)
例 3: 取引表を使用して、口座表に行をマージします。口座 ID に対する一連の取引に基づいて残高を更新し、存在しない口座については、取引の合計に基づいて新しい口座を挿入します。
MERGE INTO account AS a
    USING (SELECT id, SUM(amount) sum_amount FROM transaction
             GROUP BY id) AS t
    ON a.id = t.id
    WHEN MATCHED THEN 
      UPDATE SET balance = a.balance + t.sum_amount
    WHEN NOT MATCHED THEN
      INSERT (id, balance) VALUES (t.id, t.sum_amount)
例 4: トランザクション・ログ表を使用して、従業員ファイル表に行を挿入します。トランザクションの時刻に基づいてトランザクション・ログ表の最新の行を確認し、その内容によって電話番号と支社の列を更新します。一致する行がない場合は、従業員ファイル表に新しい行を挿入します。
MERGE INTO employee_file AS e
  USING (SELECT empid, phone, office 
              FROM (SELECT empid, phone, office, 
                           ROW_NUMBER() OVER (PARTITION BY empid
                                              ORDER BY transaction_time DESC) rn
                    FROM transaction_log) AS nt
              WHERE rn = 1) AS t
  ON e.empid = t.empid
  WHEN MATCHED THEN 
    UPDATE SET (phone, office) = (t.phone, t.office)
  WHEN NOT MATCHED THEN
    INSERT (empid, phone, office) 
           VALUES(t.empid, t.phone, t.office)    
例 5: 従業員行の動的作成値を使用して、データが既存の従業員に対応する場合はマスター従業員表を更新し、データが新しい従業員に対応する場合はその行を挿入します。以下に示すのは、C プログラムのコード断片です。
hv1 =
"MERGE INTO employee AS t
   USING (VALUES(CAST(? AS CHAR(6)), CAST(? AS VARCHAR(12)),
                      CAST(? AS CHAR(1)), CAST(? AS VARCHAR(15)),
                      CAST(? AS SMALLINT), CAST(? AS INTEGER)))
          s (empno, firstnme, midinit, lastname, edlevel, salary)
   ON t.empno = s.empno
   WHEN MATCHED THEN
     UPDATE SET salary = s.salary
   WHEN NOT MATCHED THEN 
     INSERT (empno, firstnme, midinit, lastname, edlevel, salary)
            VALUES (s.empno, s.firstnme, s.midinit, s.lastname, s.edlevel,
                    s.salary)";
EXEC SQL PREPARE s1 FROM :hv1;
EXEC SQL EXECUTE s1 USING :hv2, :hv3, :hv4, :hv5, :hv6, :hv7;
例 6: グループ A が企画したアクティビティーのリストをアーカイブ表で更新します。期日が過ぎたアクティビティーは、すべて削除します。アクティビティーの情報 (説明と日付) に変更があれば、アーカイブ表の情報を更新します。 今後の新しいアクティビティーがあれば、その情報をアーカイブ表に挿入します。アクティビティーのデータが不明な場合は、エラーを通知します。アーカイブ表では、アクティビティーの日付の指定が必須です。各グループにそれぞれのアクティビティー表があります。例えば、activities_groupA には、グループ A が企画したアクティビティーが含まれています。一方、アーカイブ表には、社内の各グループが企画した今後のすべてのアクティビティーが入っています。アーカイブ表では、グループとアクティビティーが主キーになっていて、データを NULL にすることはできません。すべてのアクティビティー表では、アクティビティーが主キーになっています。アーカイブ表の最終変更列では、CURRENT TIMESTAMP がデフォルト値として定義されています。
MERGE INTO archive ar
  USING (SELECT activity, description, date, last_modified
           FROM activities_groupA) ac
  ON (ar.activity = ac.activity) AND ar.group = 'A'
  WHEN MATCHED AND ac.date IS NULL THEN
    SIGNAL SQLSTATE '70001'
           SET MESSAGE_TEXT = 'Activity cannot be modified.  Reason: date is not known'
  WHEN MATCHED and ac.date < CURRENT DATE THEN 
    DELETE
  WHEN MATCHED AND as.last_modified < ac.last_modified THEN
    UPDATE SET (description, date, last_modified)
              = (ac.description, ac.date, DEFAULT)
  WHEN NOT MATCHED AND ac.date IS NULL THEN
    SIGNAL SQLSTATE '70002'
           SET MESSAGE_TEXT = 'Activity cannot be inserted.  Reason: date is not known'

  WHEN NOT MATCHED AND ac.date >= CURRENT DATE THEN
    INSERT (group, activity, description, date)
           VALUES ('A', ac.activity, ac.description, ac.date)
  ELSE IGNORE