はじめに

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します。


検証バージョンについて

この記事の内容はVertica 8.1で確認しています。