Oracle之merge妙用,两值相互交叉更新
来源:互联网 发布:sql中not in的意思 编辑:程序博客网 时间:2024/06/04 18:11
--构造环境
DROP TABLE T1;
CREATE TABLE T1 (NAME VARCHAR2(20),MONEY NUMBER);
INSERT INTO T1 VALUES ('A',10);
INSERT INTO T1 VALUES ('B',20);
DROP TABLE T2;
CREATE TABLE T2 (NAME VARCHAR2(20),MONEY NUMBER);
INSERT INTO T2 VALUES ('A',30);
INSERT INTO T2 VALUES ('C',20);
COMMIT;
--需求是,从T1表更新数据到T2表中,如果T2表的NAME 在T1表中已存在,就将MONEY累加,如果不存在,将T1表的记录插入到T2表中。
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
---merge 四大灵活之处
---1.UPDATE和INSERT动作可只出现其一(9I必须同时出现!)
我们可选择仅仅UPDATE目标表
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY;
--也可选择仅仅INSERT目标表而不做任何UPDATE动作
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
---2.可对MERGE语句加条件
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
WHERE T1.NAME='A';
---3.可用DELETE子句清除行
/*
在这种情况下,首先是要先满足T1.NAME=T2.NAME的记录,如果T2.NAME=’A’并不满足T1.NAME=T2.NAME过滤出的记录集,
那这个DELETE是不会生效的,在满足的条件下,可以删除目标表的记录。
*/
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
DELETE WHERE (T2.NAME = 'A');
---4.可采用无条件方式Insert
/*
方法很简单,在语法ON关键字处写上恒不等条件(如1=2)后,MATCHED语句的INSERT就变为无条件INSERT了,具体如下
*/
MERGE INTO T2
USING T1
ON (1=2)
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
DROP TABLE T1;
CREATE TABLE T1 (NAME VARCHAR2(20),MONEY NUMBER);
INSERT INTO T1 VALUES ('A',10);
INSERT INTO T1 VALUES ('B',20);
DROP TABLE T2;
CREATE TABLE T2 (NAME VARCHAR2(20),MONEY NUMBER);
INSERT INTO T2 VALUES ('A',30);
INSERT INTO T2 VALUES ('C',20);
COMMIT;
--需求是,从T1表更新数据到T2表中,如果T2表的NAME 在T1表中已存在,就将MONEY累加,如果不存在,将T1表的记录插入到T2表中。
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
---merge 四大灵活之处
---1.UPDATE和INSERT动作可只出现其一(9I必须同时出现!)
我们可选择仅仅UPDATE目标表
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY;
--也可选择仅仅INSERT目标表而不做任何UPDATE动作
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
---2.可对MERGE语句加条件
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
WHERE T1.NAME='A';
---3.可用DELETE子句清除行
/*
在这种情况下,首先是要先满足T1.NAME=T2.NAME的记录,如果T2.NAME=’A’并不满足T1.NAME=T2.NAME过滤出的记录集,
那这个DELETE是不会生效的,在满足的条件下,可以删除目标表的记录。
*/
MERGE INTO T2
USING T1
ON (T1.NAME=T2.NAME)
WHEN MATCHED THEN
UPDATE
SET T2.MONEY=T1.MONEY+T2.MONEY
DELETE WHERE (T2.NAME = 'A');
---4.可采用无条件方式Insert
/*
方法很简单,在语法ON关键字处写上恒不等条件(如1=2)后,MATCHED语句的INSERT就变为无条件INSERT了,具体如下
*/
MERGE INTO T2
USING T1
ON (1=2)
WHEN NOT MATCHED THEN
INSERT
VALUES (T1.NAME,T1.MONEY);
阅读全文
0 0
- Oracle之merge妙用,两值相互交叉更新
- Oracle更新的两种方式(merge/update内联视图)
- SQL表交叉更新(Oracle)
- oracle之merge语法
- Oracle 之 MERGE INTO
- Oracle中的Merge函数(批量更新/删除)
- oracle使用 merge 更新或插入数据
- ORACLE merge 更新链接列解决方案
- oracle使用merge更新或插入数据
- Oracle 使用MERGE INTO 语句更新数据
- Oracle 的 merge 更新和插入操作
- Oracle 使用MERGE INTO 语句更新数据
- Oracle 使用MERGE INTO 语句更新数据
- Oracle 使用MERGE INTO 语句更新数据
- Oracle 使用MERGE INTO 语句更新数据
- oracle大量数据更新优化(merge)
- oracle merge 更新或插入数据
- oracle merge 更新或插入数据
- 编译通过,可运行时找不到类,提示 classLink not found 之类的错误
- 机器学习实战代码详解(11)使用Apriori算法进行关联分析
- 前端基础小案例:纯css制作旋转披萨
- 随便写写
- java9新特性-Process 进程 API
- Oracle之merge妙用,两值相互交叉更新
- 爬虫学习01 API
- opencv 基本数据结构
- bzoj 4008(浅谈全局整体考虑设计状态实现期望dp)
- SSM+Redis采用spring-data方式整合
- C++ Qt多线程 TcpSocket服务器实例
- Jarvis OJ writeup Basic
- fremarker语法大全
- Tensorflow中padding的两种类型SAME和VALID