ヘッダーをスキップ
Oracle TimesTen In-Memory Database SQLリファレンス・ガイド
リリース7.0
E05176-02
  目次へ
目次
索引へ
索引

前へ
前へ
次へ
次へ
 

MERGE

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

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

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

アクセス制御

TimesTenインスタンスでアクセス制御が有効な場合、ターゲット表に対するWRITE権限、ソース表に対する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の場合、その行はターゲット表に挿入されます。条件にはソース表のみ参照できます。副問合せは使用できません。

説明

例5.92

この例では、DUALは単純な表として指定されます。ON句に指定されたターゲット表のUNIQUE索引にキー条件があります。

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 abort the parameter entry process.

Enter Parameter 1 (TT_INTEGER) > 10

1 row merged.

Command> SELECT * FROM MergeDualEx;

< 10, 1 >

1 row found.

Indexes on table SAMPLEUSER.T1:

T1: unique T-tree index on columns:

COL1

1 index found.

例5.93

この例では、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.