Oracle执行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;

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • ORACLE SQL-UPDATE、DELETE、INSERT优化和使用技巧分享

    UPDATE  1.先备份数据(安全.提高性能). 2.分批更新,小批量提交,防止锁表. 3.如果被更新的自动有索引,更新的数据量很大,先取消索引,再重新创建. 4.全表数据更新,如果表非常大,建议以创建新表的形式替代更新. DELETE 1.分批提交.减少锁表时间.减少回滚段压力. 2.大批量数据删除加上rownum<1000. 3.大批量删除,禁止中途ctrl+c,或kill调session. 4.大量数据删除后最好重建索引,分析表. INSERT 1.关闭redo log(ALTER TA

  • oracle执行update语句时卡住问题分析及解决办法

    问题 开发的时候debug到一条update的sql语句时程序就不动了,然后我就在plsql上试了一下,发现plsql一直在显示正在执行,等了好久也不出结果.但是奇怪的是执行其他的select语句却是可以执行的. 原因和解决方法 这种只有update无法执行其他语句可以执行的其实是因为记录锁导致的,在oracle中,执行了update或者insert语句后,都会要求commit,如果不commit却强制关闭连接,oracle就会将这条提交的记录锁住.由于我的java程序中加了事务,之前debug

  • Oracle中update和select 关联操作

    目录 1.介绍 2.解决方法 2.1.需求 2.2.错误演示 2.3.解决方法 1.介绍 本文主要向大家介绍了Oracle数据库之oracle update set select from 关联更新,通过具体的内容向大家展现,希望对大家学习Oracle数据库有所帮助. 工作中有个需求,现在新表中有一些数据跟老表的基本一样,这样只需要把老表中数据搬到新表中就可以了,同时把不同的字段修改下数据即可,在修改字段时发现,需要指定一个条件,比如主键id,来修改某条记录,这样一条一条修改效率太低了,有没有批

  • sqlserver中delete、update中使用表别名和oracle的区别

    昨天发现程序中数据分析的结果不对,重新进行分析后,原数据仍在,有值的字段被累计.心说,不对啊,是重新生成记录后才分析的啊.难道忘了DELETE了?查代码,发现有删除语句.于是在查询分析器中执行,报错.反复试几次,明白了,Delete From不认表名别名!回头想下,当初程序改完后主要是在Oracle中测的,SQLServer一直没细测. 之所以要用别名,是因为where条件中需要用到子查询写一些条件,下面不写那么复杂,仅说明一下问题. 结论: (ORACLE适用)    DELETE FROM

  • 解析mysql与Oracle update的区别

    update :单表的更新不用说了,两者一样,主要说说多表的更新 复制代码 代码如下: Oracle> Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标        update (        select t.charger_id_ new_charger_id_         from t_cus_year_status t         left join t_customer_infos cus on cus.id_ = t.cus_i

  • oracle中UPDATE nowait 的使用方法介绍

    1.UPDATE nowait 应用以下场景:查询某条数据,并对其开启数据库事务.如果查询的当前数据没有加锁,则正确返回结果,并对当前数据加锁,如果查询的当前数据已在事务中,已加锁.但返回异常信息:提示数据已加锁.SQL语句: Sql代码: 复制代码 代码如下: SELECT * FROM hold_mc_site_product_pic pic WHERE pic.id = 730127 FOR UPDATE nowait 2.应用在多线程并发的情况下.先查询出要处理的数据,并加入数据库级的锁

  • PostgreSQL批量update与oracle差异详解

    上篇文章给大家介绍了PostgreSQL实现批量插入.更新与合并操作的方法 感兴趣的朋友可以点击查看,今天给大家分享PostgreSQL批量update与oracle差异,具体内容如下所示: 当我们在数据库中有这样的需求时: 需要以某列的当前值为判断对象,将其更新成其它值. 例如下面一张表: ID INFO ---------- ---------- 2 a 1 b 3 c 4 d 5 e 我们最简单的方式就是通过多个update来完成: update t1 set id= 2 where id

  • Oracle执行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更新法就是更新一个临时建立的视图

  • Oracle创建Database Link的两种方式详解

    创建一个dblink,命名为dblink_name,从A数据库连到B数据库,B数据库的IP为192.168.1.73,端口为1521,实例名为oracle,登录名为tast,密码为test. 一菜单方式: 打开plsql,点击[File]-[New]-[Database link],打开如下图所示窗口 填好各项信息后,点击[Apply]即可完成Database Link的创建. 二SQL方式 -- Drop existing database link drop public database

  • js执行shell命令的几种方式(Node)

    目录 前言 调起shell的几种方式介绍(不限于这几种) 1.child_process 2.shelljs 3.simple-git 总结 在做一个客户端基建项目的时候,多处需要用到JS调取命令行执行shell脚本,这里对shell命令.JS执行shell命令做一个简单的介绍和总结. 前言 一般在纯前端静态页面的项目中,是不需要JS调命令行操作的,通常在Node项目,或者在Electron客户端项目中,可能会有这样的需求.(electron这个客户端框架本身就内置了node的很多方法).因此下

  • MySQL执行update语句和原数据相同会再次执行吗

    背景 本文主要测试MySQL执行update语句时,针对与原数据(即未修改)相同的update语句会在MySQL内部重新执行吗? 测试环境 MySQL5.7.25 Centos 7.4 binlog_format为ROW 参数 root@localhost : (none) 04:53:15> show variables like 'binlog_row_image'; +------------------+-------+ | Variable_name | Value | +------

  • Oracle批量插入数据的三种方式【推荐】

    第一种: begin insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,value2,value3...); insert into tableName(column1, column2, column3...) values(value1,val

  • python 轮询执行某函数的2种方式

    目标:python中每隔特定时间执行某函数 方法1:使用python的Thread类的子类Timer,该子类可控制指定函数在特定时间后执行一次: 所以为了实现多次定时执行某函数,只需要在一个while循环中多次新建Timer即可. from threading import Timer import time def printHello(): print ("Hello") print("当前时间戳是", time.time()) def loop_func(fu

  • Mybatis控制台打印SQL语句的两种方式实现

    问题描述 在使用mybatis进行开发的时候,由于可以动态拼接sql,这样大大方便了我们.但是也有一定的问题,当我们动态sql拼接的块很多的时候,我们要想从*mapper.xml中直接找出完整的sql就会非常的难,这个时候经常会需要把组合之后的完整sql调试出来比较好.下面来看两种调试出sql的两种方式 解决方案 方案1: 网上说的比较多的,之前也是这么用的一种方式 1:首先将ibatis log4j运行级别调到DEBUG可以在控制台打印出ibatis运行的sql语句 2:添加如下语句: ###

  • 详解Java执行groovy脚本的两种方式

    记录Java执行groovy脚本的两种方式,简单粗暴: 一种是通过脚本引擎ScriptEngine提供的eval(String)方法执行脚本内容:一种是执行groovy脚本: 二者都通过Invocable来传递参数并获取执行结果: Invocable:脚本引擎的解释器接口,提供invokeFunction和invokeMethod两种传递参数并获取执行结果的方法,Java JDK API文档解释如下: invokeFunction: invokeMethod: 以下为案例: 引入依赖 <depe

  • Oracle listagg去重distinct的三种方式总结

    目录 一.简介 二.方法 [a] 第一种方法 [b]第二种方法 [c]第三种方法 三.总结 一.简介 最近在工作中,在写oracle统计查询的时候,遇到listagg聚合函数分组聚合之后出现很多重复数据的问题,于是研究了一下listagg去重的几种方法 以下通过实例讲解三种实现listagg去重的方法. 二.方法 首先还原listagg聚合之后出现重复数据的现象,打开plsql,执行如下sql: select t.department_name depname, t.department_key

随机推荐