设为首页 收藏本站
查看: 845|回复: 0

[经验分享] oracle merge into 实例

[复制链接]

尚未签到

发表于 2018-9-23 08:52:14 | 显示全部楼层 |阅读模式
  Merge into 详细介绍
  MERGE语句是 oracle 9i 新增的语法,用来合并 UPDATE 和 INSERT 语句
  通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
  连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
  这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。
  
  drop table t;

  CREATE TABLE T AS SELECT ROWNUM>  drop table t1;
  CREATE TABLE T1 AS

  SELECT ROWNUM>  MERGE INTO T1 USING T
  ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME AND T.OBJECT_TYPE = T1.OBJECT_TYPE)
  WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
  WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME, T.OBJECT_TYPE);
  --insert后面不写表示插入全部列
  
  MERGE INTO T1 USING T
  ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
  WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
  WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME, T.OBJECT_TYPE);
  --常见错误,连接条件不能获得稳定的行,可以使用下面的用子查询
  MERGE INTO T1

  USING (SELECT OWNER, OBJECT_NAME, MAX(ID)>  ON (T.OWNER = T1.OWNER AND T.OBJECT_NAME = T1.TABLE_NAME)
  WHEN MATCHED THEN UPDATE SET T1.ID = T.ID
  WHEN NOT MATCHED THEN INSERT VALUES (T.ID, T.OWNER, T.OBJECT_NAME);

  SELECT>  MINUS
  SELECT * FROM T1;
  drop table subs;
  create table subs(
  msid number(9),
  ms_type char(1),
  areacode number(3)
  );
  drop table acct;
  create table acct(
  msid number(9),
  bill_month number(6),
  areacode number(3),
  fee number(8,2) default 0.00
  );
  insert into subs values(905310001,0,531);
  insert into subs values(905320001,1,532);
  insert into subs values(905330001,2,533);
  commit;
  merge into acct a --操作的表
  using subs b on (a.msid=b.msid) --使用原始数据来源的表,并且制定条件,条件必须有括号
  when matched then
  update set a.areacode=b.areacode
  --当匹配的时候,执行update操作,和直接update的语法不一样,不需要制定表名
  when not matched then
  --当不匹配的时候,执行insert操作,也不需要制定表名,若指定字段插入,
  --则在insert后用括号标明,不指定是全部插入
  insert(msid,bill_month,areacode) values(b.msid,'200702',b.areacode);
  --另外,MERGE语句的UPDATE不能修改用于连接的列,否则会报错
  select * from acct;
  select * from subs;
  --10g新特性,单个操作
  merge into acct a
  using subs b on(a.msid=b.msid)
  when not matched then
  --只有单个not matched的时候,只做插入,不做更新,只有单个matched的时候,只做更新操作
       insert(a.msid,a.bill_month,a.areacode) values(b.msid,'200702',b.areacode);
       update acct set areacode=800 where msid=905320001;
       delete from acct where areacode=533 or areacode=531;
       insert into acct values(905320001,'200702',800,0.00);
  --删除重复行
  delete from subs b where b.rowid

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-600119-1-1.html 上篇帖子: Oracle HTTP Server 下篇帖子: oracle表类型
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表