MERGE

この文は、TimesTen Scaleoutではサポートされていません。

TimesTen Classicの場合:

MERGE文を使用すると、1つまたは複数のソースから行を選択して、ターゲット表に対して更新や挿入ができます。ターゲット表に対してどの行を更新または挿入するかの評価に使用する条件を指定できます。

この文は、複数のINSERT文およびUPDATE文を組み合せるために使用します。

MERGEは、決定的な文であり、同一のMERGE文でターゲット表の同じ行を複数回更新できません。

必要な権限

ターゲット表およびソース表の所有者に必要な権限はありません。

別のユーザーが所有するターゲット表の場合はINSERTまたはUPDATE、別のユーザーが所有するソース表の場合はSELECTが必要です。

TimesTen Scaleoutでの使用

この文は、TimesTen Scaleoutではサポートされていません。

SQL構文

MERGE [hint] INTO [Owner.]TargetTableName [Alias] USING
    {[Owner.]SourceTableName|(Subquery)}[Alias] ON (Condtion)
    {MergeUpdateClause MergeInsertClause |
     MergeInsertClause MergeUpdateClause |
     MergeUpdateClause | MergeInsertClause
    }

MergeUpdateClauseの構文は次のとおりです。

WHEN MATCHED THEN UPDATE SET SetClause [WHERE Condition1]

MergeInsertClauseの構文は次のとおりです。

WHEN NOT MATCHED THEN INSERT [Columns [,...]] VALUES
    ( {{Expression | DEFAULT|NULL} [,...] }) [WHERE Condition2]

パラメータ

パラメータ 説明

hint

MERGE文に文レベルのオプティマイザ・ヒントを指定します。文レベルのオプティマイザ・ヒントの詳細は、「文レベルのオプティマイザ・ヒント」を参照してください。

[Owner.]TargetTableName

ターゲット表の名前。これは、行の更新や挿入の対象となる表です。

[Alias]

オプションで、ターゲット表やソース表の別名を指定できます。

USING {[Owner.]SourceTableName | (Subquery)} [Alias]

USING句は、データのソースに使用する表の名前や副問合せを指定します。結合や集計を使用する場合は、副問合せを使用します。オプションで、表の名前や副問合せの別名を指定できます。

ON (Condition)

行に対してMerge InsertまたはMerge Updateのどちらを実行するかを決定するために、ターゲット表の各行の評価に使用する条件を指定します。評価時に条件がTRUEの場合、SourceTableNameの対応する行を使用して、ターゲット行に実行するのはMergeUpdateClauseであるとみなされます。ソース表の複数の行がターゲット表の同一行に対応している場合、エラーが発生します。評価時に条件がTRUEでない場合、その行に対して実行するのはMergeInsertClauseであるとみなされます。

SET SetClause

UPDATE文とともに使用する句。UPDATE文の詳細は、「UPDATE」を参照してください。

[WHERE Condition1]

ON (Condition)に一致する各行に対して、Condition1が評価されます。評価時に条件がTRUEの場合、その行は更新されます。この句では、ターゲット表またはソース表を参照できます。副問合せは使用できません。この句はオプションです。

INSERT [Columns[,...]]VALUES ({{Expression |DEFAULT|NULL} [,...]})

ターゲット表に挿入する列です。INSERT文の詳細は、「INSERT」を参照してください。

[WHERE Condition2]

指定すると、Condition2が評価されます。評価時に条件がTRUEの場合、その行はターゲット表に挿入されます。条件にはソース表のみ参照できます。副問合せは使用できません。

説明

  • MergeUpdateClauseMergeInsertClauseは、一緒に、または別々に指定できます。両方指定する場合は、どちらが先でもかまいません。

  • DUALが、USING句でのみ指定された表であり、MERGE文の他の場所では参照されない場合は、副問合せではDUALを使用するかわりに、単純な表として指定します。この単純な場合でパフォーマンスを向上させるには、ON句でターゲット表の一意索引にキー条件を指定します。

  • MergeUpdateClauseの制限:

    • ON condition句で参照する列は更新できません。

    • ソース表の列は更新できません。

  • MergeInsertClauseの制限:

    • ターゲット表の列の値は挿入できません。

  • その他の制限:

    • ソース表の副問合せで集合演算子は使用しないでください。

    • MergeUpdateClauseまたはMergeInsertClauseWHERE条件で、副問合せは使用しないでください。

    • ターゲット表は、マテリアライズド・ビューのディテール表には指定できません。

    • RETURNING句はMERGE文では使用できません。

この例では、dualは単純な表として指定されます。ON句に指定されたターゲット表のUNIQUE索引にキー条件があります。この例では、DuplicateBindMode属性は1に設定されます。(デフォルトは0です)。

Command> CREATE TABLE mergedualex (col1 TT_INTEGER NOT NULL, 
           col2 TT_INTEGER, PRIMARY KEY (col1));
Command> MERGE INTO mergedualex USING dual ON (col1 = :v1)
         WHEN MATCHED THEN UPDATE SET col2 = col2 + 1
         WHEN NOT MATCHED THEN INSERT VALUES (:v1, 1);
Type '?' for help on entering parameter values.
Type '*' to end prompting and abort the command.
Type '-' to leave the parameter unbound.
Type '/;' to leave the remaining parameters unbound and execute the command.

Enter Parameter 1  'V1' (TT_INTEGER) > 10
1 row merged.
Command> SELECT * FROM mergedualex;
< 10, 1 >
1 row found.

この例では、列employee_idおよびmanager_idを含むcontactsという名前の表が作成されます。employee_idおよびmanager_idにそれぞれ101とNULLの値を持つcontactsに、行が1つ挿入されます。MERGE文で、employees表のデータを使用してcontactsに行が挿入されます。SELECT FIRST 3の行では、employee_idが101の場合は、manager_idが100に更新されることを示しています。employees表の残りの106行がcontactsに挿入されます。

Command> CREATE TABLE contacts (employee_id NUMBER (6) NOT NULL PRIMARY KEY, 
                                manager_id NUMBER (6));
Command> SELECT employee_id, manager_id FROM employees WHERE employee_id =101;
< 101, 100 >
1 row found.
Command> INSERT INTO contacts VALUES (101,null);
1 row inserted.
Command> SELECT COUNT (*) FROM employees;
< 107 >
1 row found.
Command> MERGE INTO contacts c
         USING employees e
         ON (c.employee_id = e.employee_id)
         WHEN MATCHED THEN
         UPDATE SET c.manager_id = e.manager_id
         WHEN NOT MATCHED THEN
         INSERT (employee_id, manager_id)
         VALUES (e.employee_id, e.manager_id);
107 rows merged.
Command> SELECT COUNT (*) FROM contacts;
< 107 >
1 row found.
Command> SELECT FIRST 3 employee_id,manager_id FROM employees;
< 100, <NULL> >
< 101, 100 >
< 102, 100 >
3 rows found.
Command> SELECT FIRST 3 employee_id, manager_id FROM contacts;
< 100, <NULL> >
< 101, 100 >
< 102, 100 >
3 rows found.