はじめに
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します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
//ソース表 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) |