MERGE文を使用すると、1つまたは複数のソースから行を選択して、ターゲット表に対して更新や挿入ができます。ターゲット表に対して行を更新するか挿入するかの評価に使用する条件を指定できます。
この文は、複数のINSERT文およびUPDATE文を組み合せるために使用します。
MERGEは、決定的な文です。つまり、同一のMERGE文でターゲット表の同じ行を複数回更新できません。
必要な権限
ターゲット表およびソース表の所有者に必要な権限はありません。
別のユーザーが所有するターゲット表の場合はINSERTまたはUPDATE、別のユーザーが所有するソース表の場合はSELECTが必要です。
SQL構文
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の場合、その行はターゲット表に挿入されます。条件にはソース表のみ参照できます。副問合せは使用できません。 |
説明
MergeUpdateClauseは、単独で、またはMergeInsertClauseとともに指定できます。また、MergeInsertClauseは、単独で、またはMergeUpdateClauseとともに指定できます。両方指定する場合は、どちらを先に指定してもかまいません。
DUALが、USING句でのみ指定された表であり、MERGE文の他の場所では参照されない場合は、副問合せではDUALを使用するかわりに、単純な表として指定します。 この単純な場合でパフォーマンスを向上するには、ON句でターゲット表の一意索引にキー条件を指定します。
MergeUpdateClauseの制限:
ON condition句で参照する列は更新できません。
ソース表の列は更新できません。
MergeInsertClauseの制限:
ターゲット表の列の値は挿入できません。
その他の制限:
例
この例では、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.