はじめに
VerticaはMERGE文を利用することができます。MERGE文を利用すると一回のSQLで、テーブルにデータが既に存在している場合は更新(UPDATE)、存在していない場合は追加(INSERT)をすることができます。
MERGE文
構文
MERGE
INTO [ターゲット表]
USING [ソース表]
ON [結合条件]
WHEN MATCHED THEN [UPDATE文]
WHEN NOT MATCHED THEN [INSERT文] ;
INTO [ターゲット表]
USING [ソース表]
ON [結合条件]
WHEN MATCHED THEN [UPDATE文]
WHEN NOT MATCHED THEN [INSERT文] ;
パラメータ
| 項目 | 説明 |
|---|---|
| ターゲット表 | UPDATEおよびINSERTを実行する表。 MERGE文の実行中は、ターゲット表に対してX(排他的)ロックを取得します。 |
| ソース表 | ターゲット表に結合する表。この表はターゲット表をUPDATEもしくはINSERTするためのデータを提供します。データは、実表または外部表からのみ取得できます。サブクエリは許可されません。 |
| 結合条件 | ターゲット表とソース表の結合条件。 |
| WHEN MATCHED THEN UPDATE | ソース表に結合される(一致した)ターゲット表の行に対して、1つ以上の列を更新するように指定します。 WHEN MATCHED [ AND UPDATE用フィルタ ] THEN UPDATE SET { ターゲット列 = 値 }[,...] UPDATE用フィルタはオプションとして、一致する行のセットをフィルタリングします。Vertica8.1より、複数の条件(AND)を指定できます。 【条件】 ・MERGE文にWHEN MATCHED句は、1つだけ含めることができます。 ・ターゲット列は、ターゲット表の列名のみを指定できます。表名で修飾はできません。 |
| WHEN NOT MATCHED THEN INSERT | ターゲット表に結合されない(一致しない)ソース表の行に対して、以下を実行します。 ・新しい行をターゲット表に追加します。 ・新しい行に値リストで指定した値を設定します。 WHEN NOT MATCHED [ AND INSERT用フィルタ ] THEN INSERT [ ( 列名リスト ) ] VALUES ( 値リスト ) INSERT用フィルタは、一致しない行のセットをフィルタリングします。Vertica8.1より、複数の条件(AND)を指定できます。 【条件】 ・MERGE文にWHEN NOT MATCHED句は1つだけ含めることができます。 ・列リストは、ターゲット表の列名のみを指定できます。表名で修飾することはできません。 ・INSERT用フィルタは、ソース表のみを参照できます。ターゲット表を参照した場合、エラーになります。 |
実行例
以下の例では、「t11.pk=t22.pk」 かつ 「t11.SKIP_ME_FLAG=FALSE」の場合、t22テーブルをUPDATEします。
条件に一致しない場合は、t22テーブルにINSERTします。
//ソース表
dbadmin=> select * from t11;
pk | col1 | col2 | SKIP_ME_FLAG
----+------+------+--------------
1 | 2 | 3 | t
2 | 3 | 4 | t
3 | 4 | 5 | f
4 | | 6 | f
5 | 6 | 7 | t
6 | | 8 | f
7 | 8 | | t
(7 rows)
//ターゲット表
dbadmin=> select * from t22;
pk | col1 | col2
----+------+------
1 | 2 | 4
2 | 4 | 8
3 | 6 |
4 | 8 | 16
(4 rows)
//MERGE文の実行
dbadmin=> MERGE INTO t22 USING t11 ON ( t11.pk=t22.pk ) //★①結合条件
dbadmin-> WHEN MATCHED
dbadmin-> AND t11.SKIP_ME_FLAG=FALSE //★②AND条件
dbadmin-> THEN UPDATE SET col1=t11.col1, col2=t11.col2 //★①と②に一致する場合、UPDATE実行
dbadmin-> WHEN NOT MATCHED
dbadmin-> THEN INSERT (pk, col1, col2) VALUES (t11.pk, t11.col1, t11.col2); //★①と②に一致しない場合、INSERT実行
OUTPUT
--------
5
(1 row)
//実行結果
dbadmin=> select * from t22;
pk | col1 | col2
----+------+------
1 | 2 | 4 //★何も実行しない
2 | 4 | 8 //★何も実行しない
3 | 4 | 5 //★UPDATE対象
4 | | 6 //★UPDATE対象
5 | 6 | 7 //★INSERT対象
6 | | 8 //★INSERT対象
7 | 8 | //★INSERT対象
(7 rows)検証バージョンについて
この記事の内容はVertica 9.1で確認しています。