OpenText Analytics Database 旧Vertica

技術情報サイト

Analytics Database

MERGE文の使用方法

公開日:
更新日:
基本操作
#テーブル
#コマンド

はじめに

VerticaはMERGE文を利用することができます。MERGE文を利用すると一回のSQLで、テーブルにデータが既に存在している場合は更新(UPDATE)、存在していない場合は追加(INSERT)をすることができます。

MERGE文

構文

MERGE
 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で確認しています。