• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录

沧海·旭日

旭日东升处 沧海碧波殊
  • 博客园
  • 联系
  • 订阅
  • 管理

公告

View Post

关于ORACLE中插入,更新(MERGE)的使用

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

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)可以是任何的查询表,比如说外部表或者管道化表函数。

posted on 2006-11-05 17:22  changhai-xuri  阅读(610)  评论(0)    收藏  举报

刷新页面返回顶部
 
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3