oracle中的merge into用法解析
一:merge into的形式
MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] and [...]...)
WHEN MATCHED THEN
[UPDATE sql]
WHEN NOT MATCHED THEN
[INSERT sql]
二:作用
判断B表和A表是否满足on条件,如果满足则用B表去更新A表,如果不满足,则将B表数据插入A表,但有很多可选项。
例如:
1:正常模式
2:只update或者只insert
3:带条件的update或带条件的insert
4:全插入insert实现
5:带delete的update -------------------不做讲解
三:正常模式
例如:
1:创建表A_MERGE
create table A_MERGE
(
id NUMBER not null,
name VARCHAR2(12) not null,
year NUMBER
);
2:创建表B_MERGE
create table B_MERGE
(
id NUMBER not null,
aid NUMBER not null,
name VARCHAR2(12) not null,
year NUMBER,
city VARCHAR2(12)
);
3:向A_MERGE和B_MERGE插入测试数据
insert into A_MERGE values(1,'liuwei',20);
insert into A_MERGE values(2,'zhangbin',21);
insert into A_MERGE values(3,'fuguo',20);
commit;
insert into B_MERGE values(1,2,'zhangbin',30,'吉林');
insert into B_MERGE values(2,4,'yihe',33,'黑龙江');
insert into B_MERGE values(3,3,'fuguo','','山东');
commit;
4:MERGE INTO A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE B) C
ON (A.id=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR
WHEN NOT MATCHED THEN
INSERT(A.ID,A.NAME,A.YEAR) VALUES(C.AID,C.NAME,C.YEAR);
commit;
5:解析
a:被更新的表写在MEGER INTO之后
b:更新来源数据表写在USING之后,并将相关字段查询出来,为查询结果定义别名
c:ON之后表示更新满足的条件
d:WHEN MATCHED THEN:表示当满足条件时要执行的操作。
e:UPDATE SET 被更新表.被更新字段 = 更新表.更新字段---此更新语句不同于常规更新语句
f:WHEN NOT MATCHED THEN:表示当不满足条件时要执行的操作。
g:INSERT (被更新表.被更新字段,...) VALUES(更新表.更新字段,...)。
h:commit:表示提交事务
四:只update或只insert
ON(A.ID=C.AID)
WHEN MATCHED THEN
UPDATE SET A.YEAR=C.YEAR;
commit;
解析---只更新模式:
1:将正常模式下的插入语句去除。
2:使用WHEN MATCHED THEN,当满足条件的情况。
-------------------------------只插入--------------------------------------------------------
merge into A_MERGE A
USING (select B.AID,B.NAME,B.YEAR from B_MERGE 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);
commit;
解析---只插入模式:
1:将正常模式下的更新操作去除
2:使用WHEN NOT MATCHED THEN,当不满足ON条件时执行插入操作。
我们在on中进行条件匹配之后,还可以在后面的insert和update中对on删选出来的记录再做一次条件判断,用来控制
那些需要更新,那些需要插入。
merge into A_MERGE A
USING (select B.AID,B.name,B.year,B.city from B_MERGE B) C
ON(A.id=C.AID)
when matched then
update SET A.name=C.name where C.city != '江西'
when not matched then
insert(A.ID,A.name,A.year) values(c.AID,C.name,C.year) where C.city='江西';
commit;
1:当满足on条件并且满足where条件才会执行更新操作。
2:当不满足on条件但是满足where条件才会执行插入操作。
有时候我们需要将一张表的所有的数据插入到另一张表中,此时就可以添加常量过滤谓词来实现,让其只满足匹配和不匹配,
这样就只有update或insert操作了。
merge into C_MERGE C
USING (select B.AID,B.NAME,B.City from B_MERGE B) C
ON (1=0)
when not matched then
insert(C.ID,C.NAME,C.City) values(B.AID,B.NAME,B.City);
commit;
on条件处于永远不匹配的条件,此时就会执行全表插入操作。
源地址:https://www.cnblogs.com/zhaoja/p/11334544.html
oracle中的merge into用法解析的更多相关文章
- 在oracle中使用merge into实现更新和插入数据
目录 oracle中使用merge into DUAL表解释 使用场景 用法 单表 多表 oracle中使用merge into DUAL表解释 在Oracle数据库中,dual是Oracle中的一个 ...
- Oracle中rownum的基本用法
Oracle中rownum的基本用法 对于rownum来说它是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,依此类推,这个伪字段可以用于限制查询返回的总行数,且r ...
- Oracle 中 CONTAINS 函数的用法
Oracle 中 CONTAINS 函数的用法 1. 查询住址在北京的学生 SELECT student_id,student_name FROM students WHERE CONTAINS( a ...
- oracle中next_day()、last_day()函数解析
oracle中next_day()函数解析 Sql代码 当前系统时间的下一星期一的时间select next_day(sysdate,1) from dual NEXT_DAY(date,char ...
- [转载]Oracle中TO_NUMBER()函数的用法
1 用法简介TO_NUMBER函数()是Oracle中常用的类型转换函数之一,主要是将字符串转换为数值型的格式,与TO_CHAR()函数的作用正好相反. To_number函数的格式如下: To_nu ...
- Oracle中 to_date和to_char用法
to_date("要转换的字符串","转换的格式") 两个参数的格式必须匹配,否则会报错. 即按照第二个参数的格式解释第一个参数. to_char(日期,& ...
- Oracle中to_number()函数的用法
to_number()函数是oracle中常用的类型转换函数之一,是将一些处理过的按一定格式编排过的字符串变回数值型的格式. 1.to_number()函数可以将char或varchar2类型的str ...
- oracle 中 to_date 函数的用法
常犯错的使用方法. to_date('2019-08-12 22:05:','yyyy-MM-dd HH24:mm:ss') Oracle中会引起错误:"ORA 01810 格式代码出现两次 ...
- oracle中merge into用法解析
merge into的形式: MERGE INTO [target-table] A USING [source-table sql] B ON([conditional expression] an ...
- oracle中分组排序函数用法 - 转
项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...
随机推荐
- PyTables文件格式、PyTables 文件支持的数据类型
翻译自 https://www.pytables.org/usersguide/file_format.html,http://www.pytables.org/usersguide/datatype ...
- powergui模块基本设置
Powergui模块可以显示系统稳定状态的电流和电压及电路(电感电流和电容电压)所有的状态变量值. 尤其是电力电子仿真中需要加入powergui模块,否则会报错. simulink仿真用到simpow ...
- 安装fearch
sudo add-apt-repository ppa:christian-boxdoerfer/fsearch-daily sudo apt-get update sudo apt-get inst ...
- php 图片加水印插件
问题:背景透明的水印图片,在加到原图上后不显示,待解决 <?php /** * 图片加水印(适用于png/jpg/gif格式) * * @author flynetcn * * @param $ ...
- yarn 安装全局包
yarn 安装全局包,无法使用,需要添加yarn的bin文件夹到环境变量 然后重启一下即可使用,再装其他全局包也可直接使用
- Day 22 22.1.2:增量式爬虫 - 场景2的实现
场景2的实现: 数据指纹 使用详情页的url充当数据指纹即可. 创建爬虫爬虫文件: cd project_name(进入项目目录) scrapy genspider 爬虫文件的名称(自定义一个名字即可 ...
- css如何将content、background、background-image生成的背景进行翻转
方法 transform: scaleX(-1); 本例是水平翻转180度,方向可修改X为Y/Z. 注意如果是content,需要设置display: inline-block/block;
- el-scrollbar 饿了么滚动条不出现 bug
el-scrollbar 饿了么滚动条不出现 bug 解决方法:el-scrollbar 的直接子元素样式需要设置为 display: inline-block;
- Cascader 级联选择器 数据不回显
这次的问题原因主要是因为 数据存在于两张表 并且索引的字段不同 一个为id(int)一个为字符(string) 在做修改操作数据回显的时候会导致 后端返回的数组中一个为字符一个为bumber ...
- Lua中对自定义二维表进行添加、修改、计算、删除、判断是否存在操作
引言: 最近刚稍微深入了解一下Lua,正好最近需要用到Lua中对表的操作,于是借助现有的了解实现了对一个简单的二维表进行添加.修改.计算.删除及判断存在的操作 表的创建及相关方法: 1. 创建表及自定 ...