`

Oracle中不能用UPDATE FROM的解决方法

 
阅读更多

(此原文在我的百度空间里,原样搬运到新浪博客)

又是oracle!!

今天的业务需求是在SQL语句中完成一个更新,但所要的参数需要在另外2张表中查询,而且肯定不能抛到JAVA层用多次查询来完成。

最后的结果是:首先要连用2次 LEFT JOIN 构造一张表,然后做为子查询放到UPDATE语句中作为筛选条件。

要是SQL SERVER数据库,直接用update .....from.(子查询) on ....这样的语句就可以了。

今天鼓捣了半天,一直出不来,搜索了下,我X,原来ORACLE不支持 UPDATE.... FROM2011-03-10 <wbr>15:00 <wbr>Oracle中不能用UPDATE <wbr>FROM的解决方法

 

搜索到了2种解决方案。其中一种语句结构比较简单,以下是原文引用:

update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
set asal = bsal,
acomm = bcomm;

这里的表是一个类视图。
当然你执行时可能会遇到如下错误:

ERROR 位于第 2 行:
ORA-01779: 无法修改与非键值保存表对应的列
这是因为新建的表emp1还没有主键的缘故

下面增加一个主键

alter table emp1
add constraint pk_emp1 primary key (empno);

执行之后

在执行前面的语句就能成功。

试了一会,果然行不通。我这次的情况是把子查询做为筛选,这个是把另一张实体表做为筛选条件。还是老实用另一种看上去麻烦的语句吧。2011-03-10 <wbr>15:00 <wbr>Oracle中不能用UPDATE <wbr>FROM的解决方法

语句结构是这样的:

Update emp
Set(sal,comm) = (select sal,comm. From emp1 where emp.empno = emp1.empno)
Where exists (select 1 from emp1 where emp1.empno = emp.empno)

最后那句Where exists (select 1 from emp1 where emp1.empno = emp.empno)完全没见过,管他的,试试呗。

最后成功的语句是:

UPDATE CUSTOMER.CONTRACT_ITEM_DETAIL CID
SET(M3_USEABLE,M3_USED) = (select TE.M3_USEABLE,TE.M3_USED FROM (
select PU.ORDER_ID,C.CONTRACT_ID CONTRACT_ID,C.MATKL MATKL,C.MAKTX,C.M3 M3,C.M3_USEABLE+OI.NUM M3_USEABLE,C.M3_USED-OI.NUM M3_USED,
        OI.NUM NUM FROM CUSTOMER.CONTRACT_ITEM_DETAIL c
                 LEFT JOIN CUSTOMER.PURCHASE_ORDER pu
                  ON PU.CONTRACT_ID = C.CONTRACT_NO
                 LEFT JOIN CUSTOMER.ORDER_ITEM OI
                  ON PU.ORDER_ID = OI.ORDER_ID AND OI.ORDER_ITEM_SAP_NO = C.MATKL 
    WHERE PU.ORDER_ID = 2321)TE WHERE CID.CONTRACT_ID = TE.CONTRACT_ID AND CID.MATKL = TE.MATKL)
Where exists (select 1 from (
select PU.ORDER_ID,C.CONTRACT_ID CONTRACT_ID,C.MATKL MATKL,C.MAKTX,C.M3 M3,C.M3_USEABLE+OI.NUM M3_USEABLE,C.M3_USED-OI.NUM M3_USED,
        OI.NUM NUM FROM CUSTOMER.CONTRACT_ITEM_DETAIL c
                 LEFT JOIN CUSTOMER.PURCHASE_ORDER pu
                  ON PU.CONTRACT_ID = C.CONTRACT_NO
                 LEFT JOIN CUSTOMER.ORDER_ITEM OI
                  ON PU.ORDER_ID = OI.ORDER_ID AND OI.ORDER_ITEM_SAP_NO = C.MATKL 
    WHERE PU.ORDER_ID = 2321)TE WHERE TE.CONTRACT_ID = CID.CONTRACT_ID AND TE.MATKL = CID.MATKL)

 

其中子查询TE表整个代码写了2次,使看上去比较复杂,其实很简单。。最后这个更新语句只需要输入订单号ORDER_ID 和物料号MATKL,以及输入月份在JAVA中把月份数字拼到M后面就可以了。放在这里做个保存吧,以后要是有需要可以查阅。

分享到:
评论

相关推荐

    数据库oracle for update of和for update的区别

    数据库oracle锁: for update of和for update的区别,解释得很清楚,有很多详细例子说明。

    ORACLE_多表关联_UPDATE_语句

    例如: 两表(多表)关联update -- 仅在where字句中的连接 --这次提取的数据都是VIP,且包括新增的,所以顺便更新客户类别 update customers a -- 使用别名 set customer_type='01' --01 为vip,00为普通 where ...

    shell连接oracle数据库执行SQL工具脚本-支持select+inset+update

    shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...

    sql server的 update from 语句的深究

    一般来说update一个表, 使用where语句即可: 代码如下: UPDATE Ttest SET  statusInd = ‘ACTIVE’  WHERE  id = 123 注意: update 语句后面的table名称,是不可以启用别名的。 那么此时的id字段,就是来自...

    Oracle两张表关联批量更新其中一张表的数据

    方法一(推荐): UPDATE 表2 SET 表2.C = (SELECT B FROM 表1 WHERE 表1.A = 表2.A) WHERE EXISTS (SELECT 1 FROM 表1 WHERE 表1.A = 表2.A); 尤其注意最后的外层where条件尤为重要,是锁定其批量更新数据...

    ORACLE应用中常见的傻瓜问题1000问-1

    如何用BBB表的资料去更新AAA表的资料(有关联的字段) &lt;br&gt; UPDATE AAA SET BNS_SNM=(SELECT BNS_SNM FROM BBB WHERE AAA.DPT_NO=BBB.DPT_NO) WHERE BBB.DPT_NO IS NOT NULL; &lt;br&gt; 23. P4计算机安装方法 ...

    Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错

    2.将ojdbc6.jar包添加到maven,也就是运行下面的语句,注意:不是在C盘下运行,是在该目录下执行下面的语句,如果你不知道你的版本号,可以执行select * from v$version;进行查看 mvn install:install-file -...

    解析mysql与Oracle update的区别

    两者一样,主要说说多表的更新 代码如下: Oracle&gt; Oracle的多表更新要求比较严格,所以有的时候不是很好写,我们可以试试Oracle的游标 update ( select t.charger_id_ new_charger_id_ from t_cus_year_status t...

    oracle实验报告

    (1) 了解Oracle的工作环境和基本使用方法。 (2) 练习标准SQL的数据操作,查询命令及其查询优化。 (3) 学会使用高级SQL命令,排序、分组、自连接查询等。 (4) 学会使用SQL*PLUS命令显示报表,存储到文件等。 【实验...

    Loadrunner-oracle连接/修改update/select用例

    //这个遍历刚才查询的结果,第二个参数0表示就1行,负号表示遍历所有结果,绝对值表示实际有多少行,第三个参数表示一次遍历最大进行多少行(不能大于LRD_VAR_DESC中定义的第二个参数,即最大行数)

    oracle中UPDATE nowait 的使用方法介绍

    SQL语句: Sql代码: 代码如下: SELECT * FROM hold_mc_site_product_pic pic WHERE pic.id = 730127 FOR UPDATE nowait 2、应用在多线程并发的情况下。先查询出要处理的数据,并加入数据库级的锁,处理完后,写入...

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其一、就业面广:全球前100强企业99家都在使用ORACLE相关技术,中国政府机构,大中型企事业单位都能有ORACLE技术的工程师岗位。 其二、技术层次深:如果期望进入IT服务或者产品公司(类似毕博、DELL、IBM等),...

    Oracle SQL高级编程(资深Oracle专家力作,OakTable团队推荐)--随书源代码

    有近20年使用Oracle技术产品以及Oracle数据库管理员/Oracle数据库应用管理员的经验,是真正应用集群、性能调优以及数据库内部属性方面的专家。同时是一位演讲家及Oracle ACE。  JARED STILL 从1994年就开始使用...

    oracle Session与lock 解除

    其他对象只能查询这些数据行,不能进行update、delete或select...for update操作。 insert / update / delete ... ; 是3的锁。 没有commit之前插入同样的一条记录会没有反应, 因为后一个3的锁会一直...

    oracle advanced sql 高级SQL教程 ORACLE官方教材

    Using a Subquery in the FROM Clause 4-10 Scalar Subquery Expressions 4-11 Scalar Subqueries: Examples 4-12 Correlated Subqueries 4-14 Using Correlated Subqueries 4-16 Using the EXISTS Operator 4-18 ...

    JAVA连接ORACLE数据库方法及测试

    // 执行查询时用的方法 public ResultSet select(String sql) { Connection c = create();//获取连接对象,可以不声明 ResultSet rs = null; try { Statement st = c.createStatement();// 获取Staetment...

    锁表问题解决

    Oracle锁表常用sql语句: select sess.sid, sess.serial#, lo.oracle_username, lo.os_user_name, ao.object_name, lo.locked_mode from v$locked_object lo, dba_objects ao, v$session sess ...

    最全的oracle常用命令大全.txt

    下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL&gt;select username,default_tablespace from user_users; 查看当前用户的角色 SQL&gt;select * from user_...

    ORACLE重建索引总结

    使用带有coalesce参数时重建期间不需要额外空间,它只是在重建索引时将处于同一个索引分支内的叶块拼合起来,这最大限度的减少了与查询过程中相关的潜在的加锁问题,但是,coalesce选项不能用来将一个索引转移到其他...

Global site tag (gtag.js) - Google Analytics