zoukankan      html  css  js  c++  java
  • 浅谈之merge into table

    实验准备:

    create table dd1(id varchar2(50) primary key,name varchar2(10),sal number(9,2));
    create table dd2(id varchar2(50) primary key,name varchar2(10),sal number(9,2));
    
    insert into dd1 values(get_uuid,'tina',5000);
    insert into dd1 values(get_uuid,'monica',6000);
    insert into dd1 values(get_uuid,'jojo',8000);
    insert into dd2 values(get_uuid,'sany',4000);
    insert into dd2 values(get_uuid,'selina',6000);
    insert into dd2 values(get_uuid,'monica',7000);
    insert into dd2 values(get_uuid,'jojo',9000);
    commit;

    说明:get_uuid是我程序里建的生成主键的函数,可以根据自己实际情况自行设定。下面附上我生成主键的函数语句

    CREATE OR REPLACE FUNCTION get_uuid RETURN VARCHAR IS
      guid VARCHAR(50);
    BEGIN
      guid := lower(RAWTOHEX(sys_guid()));
      RETURN substr(guid, 1, 8) || '-' || substr(guid, 9, 4) || '-' || substr(guid,
                                                                              13,
                                                                              4) || '-' || substr(guid,
                                                                                                  17,
                                                                                                  4) || '-' || substr(guid, 21, 12);                                                                                              
    END get_uuid;

    然后执行merge into table 语句:

    merge into dd1
    using dd2
    on (dd2.name = dd1.name)
    when matched then
      update set dd1.sal = dd2.sal
    when not matched then
      insert
        (dd1.id, dd1.name, dd1.sal)
      values
        ((select get_uuid from dual), dd2.name, dd2.sal);

    报错:

    解决方法:

    merge into dd1
    using dd2
    on (dd2.name = dd1.name)
    when matched then
      update set dd1.sal = dd2.sal
    when not matched then
      insert (dd1.id, dd1.name, dd1.sal) values (get_uuid, dd2.name, dd2.sal);

    调整了insert values后面的函数调用方法之后问题得到解决,看了一些网站或书籍介绍说是merge into 语句是通过一次两表扫描之后完全更新操作,那么我的理解是子查询只是调用一次,不会是需要插入N条记录调用N次,所有这个时候通过函数调用获得主键即是一个键值,这样我们往被更新表插入记录的时候就会报错违反主键唯一性约束。这里就要说到标量子查询了吧,对于标量子查询这个问题,重点关注是子查询和主表的关联关系,假设通过关联出六条记录,那么我的标量子查询就要去执行六次,每此取出子查询对应的记录(由此也能看出这个标量子查询的效率很低),而上面报错的查询标量子查询和主表查询没有关联关系,所有子查询就执行一次,也就是只有一个结果,所以在插入记录时报错违反主键唯一性约束。(这是个人理解,欢迎朋友提出意见或讨论)

  • 相关阅读:
    美团配送系统架构演进实践
    系统学习NLP(二十一)--SWEM
    转:大众点评信息流基于文本生成的创意优化实践
    从Encoder到Decoder实现Seq2Seq模型
    从YOLOv1到YOLOv3,目标检测的进化之路
    23岁融了一千万,被创新工场投资,创业就是解决问题。专访丨陈海沙
    通俗理解word2vec
    关于眼下分词的想法
    Angular 2的12个经典面试问题汇总(文末附带Angular測试)
    ubuntu14.04-64位机配置android开发环境,ADT,sdk,eclipsea
  • 原文地址:https://www.cnblogs.com/jwangpip/p/9163008.html
Copyright © 2011-2022 走看看