惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

IT之家
IT之家
aimingoo的专栏
aimingoo的专栏
H
Help Net Security
L
LangChain Blog
M
MIT News - Artificial intelligence
The GitHub Blog
The GitHub Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
C
Check Point Blog
P
Proofpoint News Feed
J
Java Code Geeks
大猫的无限游戏
大猫的无限游戏
博客园_首页
Blog — PlanetScale
Blog — PlanetScale
U
Unit 42
I
InfoQ
月光博客
月光博客
爱范儿
爱范儿
Stack Overflow Blog
Stack Overflow Blog
V
Visual Studio Blog
Y
Y Combinator Blog
Microsoft Security Blog
Microsoft Security Blog
博客园 - Franky
D
Docker
B
Blog

博客园 - changhai-xuri

[转]VS2005快捷键大全 <转载>C#基础面试题 转载(ASP.NET页面之间传递值的几种方式?) 面试的一些体会 程序之路对我来说有多远呢? 晕!我还是没办法改页面顶部的背景图片 关于开发模式的一点点思考 VB和VSS断绝往来了咋办? JAVA中对象的序列化 C#中的代理(Delegate) Spoolsv占用CPU100%的解决方案 Js文件中调用其它Js函数的方法 设计模式之策略模式探讨初步 设计模式之策略模式在设计一群鸭子中的应用 修改一下博客的式样 软件开发模式--软件开发教父与国内高手论道实录全文 微软公司软件开发模式简介 自己写的使用聚集函数实现多行字串合并处理 (转载)使用自定义聚集函数来实现分组合并字符串
关于ORACLE中插入,更新(MERGE)的使用
changhai-xuri · 2006-11-05 · via 博客园 - changhai-xuri

Oracle9i引入了一个新的SQL语句,使用本语句可以在一条语句中连接两个表。
以前要使用UPDATE去更新两个表中都存在的记录,或者用INSERT添加两个合并表中不存在的记录,必须写两个SQL语句,
而现在这两种操作都只要一条SQL MERGE语句就可以实现。

create table inventory (part_nointeger integer,part_count integer); 

insert into inventory values(1,5);

insert into inventory values(3,6); 


create table shipment (part_nointeger integer,part_count integer);

insert into shipment values(1,2);
insert into shipment values(2,2);

MERGE 
INTO inventory
    USING shipment
    
ON (inventory.part_nointeger=shipment.part_nointeger)
WHEN MATCHED THEN
   
UPDATE SET inventory.part_count=inventory.part_count+shipment.part_count  --注意如果这里前面的part_count字段不指明表名,默认为shipment字段,结果会为4
WHEN NOT MATCHED THEN
   
INSERT VALUES (shipment.part_nointeger,shipment.part_count);

commit;
select * from inventory;
   
truncate table inventory;     
/*
  PART_NO   PART_COUNT
----------              ----------
      1                      7
      3                      6
      2                      2 

执行的结果是shipment数据已经被合并到inventory中,所以与inventory中某些东西相匹配的shipment都会被添加到count中,
而没有得到的匹配的就不会添加到inventory中。

在MERGE语句中必须指定一个WHEN MATCHED和一个WHEN NOT MATHCED语句。
如果除这两种情况之外还有别的情况,你可能就需要使用一个常规的INSERT或者UPDATE语句。

另外一点是MERGE语句一次只能修改一行记录,而且不能修改在ON子句中引用的列。

MERGE语句的目标表(target table)(在本例中是inventory)必须是一个可以使用INSERT语句进行插入或者UPDATE语句进行更新的表或者视图。
源表(source table)(在本例中是shipment)可以是任何的查询表,比如说外部表或者管道化表函数。