• Oracle(00):Update语句


    Oracle没有update from语法,可以通过四种写法实现同样的功能:

    一、标准update语法(常用、速度可能最慢)

    当更新的表示单个或者被更新的字段不需要关联表带过来,此法是最好的选择。

    update  a 
    set a.c2= (select b.c2from  b where a.c1=b.c1)
    where exists   (select 1 from   b where a.c1=b.c1)

    二、内联视图更新(关联主键字段,速度较快)

    inline view更新法就是更新一个临时建立的视图。

    方案:更新一个临时建立的视图。要求B表的主键字段必须在where条件中,并且是以=号来关联被更新表。

    update (select a.c2 as ac2,b.c2 as bc2 from a, b where a.c1=b.c1 and a.c3=2011’) as M 
    set ac2=bc2

    三、merge更新法 (关联字段非主键时,速度较快)

    merge是oracle特有的语句,语法如下:

    MERGE INTO table_name alias1 --主表,即需要被修改的表
    USING (table | view | sub_query) alias2 --从表,即来源表
    ON (join condition) --连接条件
    WHEN MATCHED THEN --在匹配的记录中进行
      UPDATE table_name SET col1 = col_val1, col2 = col2_val --更改主表信息
    WHEN NOT MATCHED THEN --在不匹配的情况下,筛选从表记录插入到主表【可选】
      INSERT (column_list) VALUES (column_values);

    原理分析:在alias2中Select出来的数据,每一条都跟alias1进行 ON (join condition)的比较,如果匹配,就对alias1表进行更新的操作(Update),如果不匹配,就对alias1表进行插入操作(Insert)。

    执行merge不会返回影响的行数,最多只能两个表关联。

    merge into a
    using b 
     on (a.c1=b.c1 and a.c3=2011’)
       when matched then
    update a.c2=b.c2

    四、快速游标更新法(复杂逻辑时,效率很高)

    语法:

    begin
    for cr in (查询语句) loop  --循环
    update table_name set ...   --更新语句(根据查询出来的结果集合)
    end loop;  --结束循环
    end;
    begin
        for cur in (select a.rowid  ,b.c2 from  a, b where a.c1=b.c1 and a.c3=2011’ )  loop
            UPDATE a  set c2=cur.c2  where rowid=cur.rowid;
        end loop;
    end;
  • 相关阅读:
    maxsdk sample中3dsexp.rc点不开并提示specstrings.h中找不到sal.h解法
    安装max plugin wizard
    max plugin wizard,project creation faild解法
    unity, 由5.2.1f1升级到5.3.5f1,2d物理不正常解法
    maxscript,#号和$号
    maxscript,执行选中代码片段
    maxscript,MAXScript Listener下输入print "hi"为什么输出两次
    editplus查找替换的正则表达式应用
    命令行创建畸形文件夹+畸形目录管理工具(DeformityPath)
    费曼技巧——高速学习的方法
  • 原文地址:https://www.cnblogs.com/springsnow/p/9399281.html
Copyright © 2020-2023  润新知