説明
このステートメントは、ソーステーブルに基づいてターゲットテーブルのデータを更新するために使用されます。ターゲットテーブルに対して挿入、更新、または削除を行うことができます。
制限事項と注意点
ターゲットテーブルのパーティションが指定されている場合、更新操作は指定されたパーティションを持つターゲットテーブルのデータのみに影響します。
ターゲットテーブルとソーステーブルの両方のパーティションが指定されている場合、マッチング操作はターゲットテーブルの指定されたパーティションとソーステーブルの指定されたパーティションのデータに基づいて実行されます。
ターゲットテーブルとソーステーブルの間でマッチするデータがない場合、更新操作は実行されません。
構文
MERGE [hint_options] INTO target_table_name [PARTITION(partition_name_list)] [opt_alias]
USING source_table_name [PARTITION(partition_name_list)] [opt_alias]
ON (expr)
[merge_update_clause]
[merge_insert_clause];
partition_name_list:
partition_name [, partition_name ...]
merge_update_clause:
WHEN MATCHED THEN UPDATE SET update_asgn_list [WHERE expr] [DELETE WHERE expr]
merge_insert_clause:
WHEN NOT MATCHED THEN INSERT opt_insert_columns VALUES '(' insert_vals ')' [WHERE expr]
パラメータの説明
| パラメータ | 説明 |
|---|---|
| hint_options | Hintオプションを指定します。オプションです。 |
| target_table_name | 更新または挿入するターゲットテーブルの名前を指定します。 |
| source_table_name | 更新または挿入するデータソースのテーブル名を指定します。 |
| PARTITION(partition_name_list) | オプションで、ターゲットテーブルまたはソーステーブルのパーティションを指定します。複数のパーティション名間は、英字のカンマ(,)で区切ります。
説明OceanBaseデータベースV4.3.5では、V4.3.5 BP2以降のバージョンから、 |
| opt_alias | オプションで、テーブルエイリアスを指定します。 |
| ON (expr) | ソーステーブルとターゲットテーブルの結合条件。 |
| update_asgn_list | 更新ステートメントの代入操作。 |
| WHERE expr | 更新、削除、または挿入操作をトリガーする際に満たす必要がある条件。 |
例
例のテーブルとデータは、以下の定義に基づいています:
obclient> CREATE TABLE tbl1 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> CREATE TABLE tbl2 (col1 INT, col2 INT);
Query OK, 0 rows affected
obclient> INSERT INTO tbl1 VALUES(0, 0),(1, null),(2, null);
Query OK, 3 row affected
obclient> INSERT INTO tbl2 VALUES(1, 1),(2, 20),(3, 3),(4, 40);
Query OK, 4 row affected
obclient> SELECT * FROM tbl1;
+------+------+
| COL1 | COL2 |
+------+------+
| 0 | 0 |
| 1 | NULL |
| 2 | NULL |
+------+------+
3 rows in set
obclient> SELECT * FROM tbl2;
+------+------+
| COL1 | COL2 |
+------+------+
| 1 | 1 |
| 2 | 20 |
| 3 | 3 |
| 4 | 40 |
+------+------+
4 rows in set
tbl2 のデータに基づいて tbl1 のデータを更新します:
tbl1.col1がtbl2内でtbl1.col1の値が同じ行を見つける場合、tbl1.col2の値が空ならば、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