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]
パラメータ
| パラメータ | 説明 |
|---|---|
|
|
|
|
|
ターゲット表の名前。これは、行の更新や挿入の対象となる表です。 |
|
|
オプションで、ターゲット表やソース表の別名を指定できます。 |
|
|
|
|
|
行に対してMerge InsertまたはMerge Updateのどちらを実行するかを決定するために、ターゲット表の各行の評価に使用する条件を指定します。評価時に条件がTRUEの場合、 |
|
|
|
|
|
|
|
|
ターゲット表に挿入する列です。 |
|
|
指定すると、 |
説明
-
MergeUpdateClauseとMergeInsertClauseは、一緒に、または別々に指定できます。両方指定する場合は、どちらが先でもかまいません。 -
DUALが、USING句でのみ指定された表であり、MERGE文の他の場所では参照されない場合は、副問合せではDUALを使用するかわりに、単純な表として指定します。この単純な場合でパフォーマンスを向上させるには、ON句でターゲット表の一意索引にキー条件を指定します。 -
MergeUpdateClauseの制限:-
ONcondition句で参照する列は更新できません。 -
ソース表の列は更新できません。
-
-
MergeInsertClauseの制限:-
ターゲット表の列の値は挿入できません。
-
-
その他の制限:
-
ソース表の副問合せで集合演算子は使用しないでください。
-
MergeUpdateClauseまたはMergeInsertClauseのWHERE条件で、副問合せは使用しないでください。 -
ターゲット表は、マテリアライズド・ビューのディテール表には指定できません。
-
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.