可以同时增删改
旧表倒新表
语法如下:
sql
MERGE INTO 表名1 ---目标表(即要对此表进行增删改)
USING 表名2 ---数据源(给表1提供数据的)
ON (关联条件) ---必须是主键列或者唯一列
关联条件匹配成功时,可以将表2 的数据修改到表1,当无匹配数据的时候,可以将表2 的数据增加到表1中
sql
MERGE INTO 表名1 ---目标表(即要对此表进行增删改)
USING 表名2 ---数据源(给表1提供数据的)
ON (关联条件) ---必须是主键列或者唯一列
WHEN MATCHED
THEN UPDATE SET 表1.列名1= 值1 | 表名2.列名1 |
WHERE 条件1 ---当匹配成功的时候,然后修改表1(不需要写表1了)
--或者可以写 DELETE(可以不写)
DELETE
WHERE 条件2 ---如果前面还有条件1,要想删除,必须同时满足条件1,条件2(DELETE很少做的)
---已经可以结束了,必须要有UPDATE,不能只有DELETE,DELETE可以没有
WHEN NOT MATCHED ---当匹配不成功的时候
THEN INSERT (表名1.列名1,表名1.列名2,表名1.列名3......)
VALUES(表名2.列名1,表名2.列名2,表名2.列名3.....)
merge into 是英文的一个短语,意思是汇入,合并。顾名思义,merge into是合并了insert和update操作,其执行效率要高于分别单独执行insert和update语句。
//创建表
sql
create table YLB_TEST_001
( ID NUMBER, NAME VARCHAR2(20) );
create table YLB_TEST_002
( ID NUMBER, NAME VARCHAR2(20));
//插入数据
sql
insert into ylb_test_001 values(1,'Arlene');
insert into ylb_test_001 values(2,'Bobby');
insert into ylb_test_001 values(3,'Tommy');
insert into ylb_test_001 values(4,'Jackey');
insert into ylb_test_002 values(1,'Arlene001');
//执行sql
sql
merge into ylb_test_002 a
using ylb_test_001 b
on (a.id=b.id)
when matched then
update set a.name = b.name
when not matched then
insert values (b.id,b.name);
结果:
小提示:merge into 目标表 using 源表 on (匹配条件) when matched then 执行update 操作 或 delete操作 when not matched then 执行 insert 操作。
oracle不支持delete操作;
在SQL2008中,新增了一个关键字:Merge,这个和Oracle的Merge的用法差不多,只是新增了一个delete方法而已。
源表 匹配条件字段unique