説明
このステートメントは、ソーステーブルに基づいてターゲットテーブルのデータを更新するために使用され、ターゲットテーブルに対して挿入、更新、または削除を行うことができます。
使用上の制限と注意事項
ターゲットテーブルのパーティションを指定した場合、更新操作は指定されたパーティションを持つターゲットテーブルのデータのみに影響します。
ターゲットテーブルとソーステーブルの両方のパーティションを指定した場合、マッチング操作はターゲットテーブルの指定されたパーティションとソーステーブルの指定されたパーティションのデータに基づいて行われます。
ターゲットテーブルとソーステーブルでマッチするデータがない場合、更新操作は実行されません。
構文
MERGE [hint_options]
INTO target_table [PARTITION(partition_name_list)] [t_alias]
USING { source_table | subquery | TABLE(collection_expression) } [PARTITION(partition_name_list)] [s_alias]
ON (condition)
[merge_update_clause] [merge_insert_clause]
| [merge_insert_clause] [merge_update_clause]
partition_name_list:
partition_name [, partition_name ...]
merge_update_clause:
WHEN MATCHED [AND condition] THEN UPDATE SET update_asgn_list [WHERE condition] [DELETE WHERE condition]
merge_insert_clause:
WHEN NOT MATCHED [AND condition] THEN INSERT [(column [, column ...])] VALUES (expr [, expr ...]) [WHERE condition]
hint_options:
/*+ hint_text */
t_alias:
[AS] alias
s_alias:
[AS] alias
パラメータの説明
MERGE ステートメントは、ソーステーブルのデータに基づいてターゲットテーブルを更新または挿入するために使用されます。hint_options を指定して実行計画を最適化できます。
使用方法
パラメータ |
説明 |
|---|---|
| hint_options | オプティマイザーヒント。実行計画に影響を与えます。例:/*+ USE_HASH(t1) */ |
| target_table | 更新または挿入する対象テーブル名 |
| PARTITION(partition_name_list) | オプションです。対象テーブルまたはソーステーブルのパーティションを指定します。複数のパーティション名は半角カンマ(,)で区切ります。 |
| t_alias | 対象テーブルのエイリアス |
| source_table | ソーステーブル名 |
| subquery | データソースとして使用されるサブクエリ |
| TABLE(collection_expression) | データソースとして使用される集合式 |
| s_alias | ソーステーブルのエイリアス |
| ON (condition) | 結合条件。ソーステーブルと対象テーブルのマッチング方法を指定します |
| WHEN MATCHED | 対象テーブルの行がソーステーブルの行と一致した場合に実行する操作。AND condition と組み合わせて追加条件を指定できます |
| WHEN NOT MATCHED | 対象テーブルにソーステーブルと一致する行がない場合に実行する操作。AND condition と組み合わせて追加条件を指定できます |
| AND condition | オプションの追加条件。WHEN MATCHED または WHEN NOT MATCHED 句で使用します |
| UPDATE SET | WHEN MATCHED 句で更新する列と値を指定します |
| DELETE WHERE | WHEN MATCHED 句で更新後に削除する行を指定します |
| INSERT | WHEN NOT MATCHED 句で挿入する列と値を指定します。列リストを省略できますが、その場合はテーブルの各列に対して値を指定する必要があります |
| VALUES | 挿入する値を指定します |
例
例におけるテーブルとデータは、以下の定義に基づいています。
テストテーブルを作成します:
CREATE TABLE tbl1 (col1 INT, col2 INT); CREATE TABLE tbl2 (col1 INT, col2 INT);テストデータを挿入します:
INSERT INTO tbl1 VALUES(0, 0),(1, null),(2, null);INSERT INTO tbl2 VALUES(1, 1),(2, 20),(3, 3),(4, 40);テーブルデータをクエリします:
tbl1 テーブルのデータをクエリする:
SELECT * FROM tbl1;実行結果:
+------+------+ | COL1 | COL2 | +------+------+ | 0 | 0 | | 1 | NULL | | 2 | NULL | +------+------+ 3 rows in settbl2 テーブルのデータをクエリする:
SELECT * FROM tbl2;実行結果:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | 1 | | 2 | 20 | | 3 | 3 | | 4 | 40 | +------+------+ 4 rows in set
tbl2 のデータに基づいて tbl1 のデータを更新します:
tbl1.col1に対して、tbl2内で値が一致する行を見つけた場合、tbl1.col2の値がNULLならば、tbl2.col2を用いてtbl1.col2を更新します。更新後にtbl1.col2 >= 10となった場合、その行を削除します。tbl2.col1に対して、tbl1内で値が一致する行を見つけられない場合、tbl2のその行をtbl1に挿入します。ただし、挿入するのはtbl2.col2 < 10を満たす行のみです。
obclient>MERGE INTO tbl1 USING tbl2 ON (tbl1.col1 = tbl2.col1)
WHEN MATCHED THEN UPDATE SET tbl1.col2 = tbl2.col2 WHERE tbl1.col2 IS NULL DELETE
WHERE tbl1.col2 >= 10
WHEN NOT MATCHED THEN INSERT VALUES(tbl2.col1, tbl2.col2)
WHERE tbl2.col2 < 10;
Query OK, 3 rows affected
obclient> SELECT * FROM tbl1;
+------+------+
| COL1 | COL2 |
+------+------+
| 0 | 0 |
| 1 | 1 |
| 3 | 3 |
+------+------+
3 rows in set
指定したパーティションのデータを更新します。
テストパーティションテーブル
test_tbl3とtest_tbl4を作成します。CREATE TABLE test_tbl3 (col1 INT, col2 INT, PRIMARY KEY(col1)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(10), PARTITION p1 VALUES LESS THAN(20), PARTITION p2 VALUES LESS THAN(30), PARTITION p3 VALUES LESS THAN(40) );CREATE TABLE test_tbl4 (col1 INT, col2 INT, PRIMARY KEY(col1)) PARTITION BY RANGE(col1) (PARTITION p0 VALUES LESS THAN(5), PARTITION p1 VALUES LESS THAN(15), PARTITION p2 VALUES LESS THAN(25), PARTITION p3 VALUES LESS THAN(35) );テストデータを挿入します。
INSERT INTO test_tbl3 VALUES(1, 1),(5, 5),(11, 11),(13, 13),(20, 20);INSERT INTO test_tbl4 VALUES(1, 11),(5, 55),(11, 1111),(13, 1313),(20, 2020);test_tbl3のパーティションp0のデータを確認します。SELECT * FROM test_tbl3 PARTITION(p0);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | 1 | | 5 | 5 | +------+------+ 2 rows in settest_tbl4のパーティションp0とp1のデータを確認します。SELECT * FROM test_tbl4 PARTITION(p0, p1);実行結果は次のとおりです:
+------+------+ | COL1 | COL2 | +------+------+ | 1 | 11 | | 5 | 55 | | 11 | 1111 | | 13 | 1313 | +------+------+ 4 rows in settest_tbl4のパーティションp0とp1のデータをtest_tbl3のパーティションp0のデータと照合します。2つのテーブルのデータがcol1列で一致する場合、test_tbl3のcol2列の値を10000に更新します。MERGE INTO test_tbl3 PARTITION(p0) t3 USING test_tbl4 PARTITION(p0, p1) t4 ON (t3.col1 = t4.col1) WHEN MATCHED THEN UPDATE SET t3.col2 = 10000;test_tbl3のデータを確認します。SELECT * FROM test_tbl3;実行結果は次のとおりです:
+------+-------+ | COL1 | COL2 | +------+-------+ | 1 | 10000 | | 5 | 10000 | | 11 | 11 | | 13 | 13 | | 20 | 20 | +------+-------+ 5 rows in set