MERGE INTO
📄字数 3.1K
👁️阅读量 加载中...
一、概述
MERGE INTO
通常用于实现合并
操作,它结合了INSERT
和UPDATE
功能,允许在单一操作中同时完成两者,其主要目的是根据条件判断数据是否存在,从而决定是执行更新操作,还是插入新的数据,这使得MERGE INTO
在处理大量数据时能够显著提高效率,减少多次查询的开销。
二、语法格式
( update_target_list::=
, base_table_ref::=
, table_ref::=
, bool_expr::=
, insert_values::=
)
三、参数说明
INTO
语句:指定要更新/插入的表。base_table_ref
:更新/插入的表,前面可加上相应的模式名。
USING
语句:获取源表或视图数据,用于匹配目的表。table_ref
:表引用,可以是表名、子查询、连接表等。
ON
语句:指定更新/插入的条件。bool_expr
:条件表达式。
merge_update_clause
:merge 的更新语句,指定更新/插入的新列值。WHEN MATCHED THEN UPDATE
:如果 ON 语句的条件为真,则执行更新。opt_where_clause
:可选的 where 从句,用于对从表中查询出的数据做过滤或限制。
merge_insert_clause
:merge 的插入语句,指定要插入的列值。WHEN NOT MATCHED THEN INSERT
:如果 ON 语句的条件为 false,则该语句指定要插入到目标表列中的值。如果合并插入关键字之后省略列,则目标表中的列数必须与 values 语句中的字段数相匹配。
insert_merge
:插入子句,表示插入的数据。columnList2
:直接使用列名或表达式作为属性名称和属性值。insert_values
:插入数据。
注意
- 更新语句中更新的列不能为 ON 语句中的列。
四、示例
sql
-- 只 INSERT
SQL> CREATE TABLE tab_merge1(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER);
SQL> CREATE TABLE tab_merge2(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12));
SQL> INSERT INTO tab_merge1 VALUES(1,'liuwei',20)(2,'zhangbin',21)(3,'fuguo',20);
SQL> INSERT INTO tab_merge2 VALUES(1,2,'zhangbin',30,'吉林')(2,4,'yihe',33,'黑龙江')(3,3,'fuguo',44,'山东');
SQL> MERGE INTO tab_merge1 a USING (SELECT b.aid,b.name,b.year FROM tab_merge2 b) c ON(a.id=c.aid)
WHEN NOT MATCHED THEN
INSERT(a.id,a.name,a.year) VALUES(c.aid,c.name,c.year);
SQL> SELECT * FROM tab_merge1;
+----+----------+------+
| ID | NAME | YEAR |
+----+----------+------+
| 1 | liuwei | 20 |
| 2 | zhangbin | 21 |
| 3 | fuguo | 20 |
| 4 | yihe | 33 |
+----+----------+------+
-- 只 UPDATE
SQL> CREATE TABLE tab_merge3(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER);
SQL> CREATE TABLE tab_merge4(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12));
SQL> INSERT INTO tab_merge3 VALUES(1,'LIUWEI',20)(2,'ZHANGBIN',21)(3,'FUGUO',20);
SQL> INSERT INTO tab_merge4 VALUES(1,2,'ZHANGBIN',30,'吉林')(2,4,'YIHE',33,'黑龙江')(3,3,'FUGUO',44,'山东');
SQL> MERGE INTO tab_merge3 a USING (SELECT b.aid,b.name,b.year FROM tab_merge4 b) c ON(tab_merge3.id=c.aid)
WHEN MATCHED THEN UPDATE SET tab_merge3.year=c.year;
SQL> SELECT * FROM tab_merge3;
+----+----------+------+
| ID | NAME | YEAR |
+----+----------+------+
| 1 | LIUWEI | 20 |
| 2 | ZHANGBIN | 30 |
| 3 | FUGUO | 44 |
+----+----------+------+
-- 匹配时更新,不匹配时新增
SQL> CREATE TABLE tab_merge5(id NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER);
SQL> CREATE TABLE tab_merge6(id NUMBER NOT NULL,aid NUMBER NOT NULL,name VARCHAR2(12) NOT NULL,year NUMBER,city VARCHAR2(12));
SQL> INSERT INTO tab_merge5 VALUES(1,'LIUWEI',80)(2,'ZHANGBIN',30)(3,'FUGUO',20)(4,'YIHE',33)(5,'TIANTIAN',23);
SQL> INSERT INTO tab_merge6 VALUES(1,2,'ZHANGBIN',70,'吉林')(2,4,'YIHE++',33,'黑龙江')(3,3,'FUGUO',44,'山东')(4,1,'LIUWEI++',80,'江西')(5,5,'TIANTIAN',23,'河南')(6,6,'NING**QI**N',23,'江西')(7,7,'BING',24,'吉安');
SQL> MERGE INTO tab_merge5 a USING (SELECT b.aid,b.name,b.year,b.city FROM tab_merge6 b) c
ON(tab_merge5.id=c.aid)
WHEN MATCHED THEN
UPDATE SET a.name=c.name
WHEN NOT MATCHED THEN
INSERT(a.id,a.name,a.year) VALUES(c.aid,c.name,c.year);
SQL> SELECT * FROM tab_merge5;
+----+----------+------+
| ID | NAME | YEAR |
+----+----------+------+
| 1 | LIUWEI++ | 80 |
| 2 | ZHANGBIN | 30 |
| 3 | FUGUO | 20 |
| 4 | YIHE++ | 33 |
| 5 | TIANTIAN | 23 |
| 6 | NINGQIN | 23 |
| 7 | BING | 24 |
+----+----------+------+