MERGE文を使用すると、1つまたは複数のソースから行を選択して、ターゲット表に対して更新や挿入ができます。ターゲット表に対して行を更新するか挿入するかの評価に使用する条件を指定できます。
この文は、複数のINSERT文およびUPDATE文を組み合せるために使用します。
MERGEは、決定的な文です。つまり、同一のMERGE文でターゲット表の同じ行を複数回更新できません。
TimesTenインスタンスでアクセス制御が有効な場合、ターゲット表に対するWRITE権限、ソース表に対するSELECT権限が必要です。
MERGE 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文には、次のパラメータがあります。
[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の場合、その行はターゲット表に挿入されます。条件にはソース表のみ参照できます。副問合せは使用できません。 |
この例では、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.