(此原文在我的百度空间里,原样搬运到新浪博客)
又是oracle!!
今天的业务需求是在SQL语句中完成一个更新,但所要的参数需要在另外2张表中查询,而且肯定不能抛到JAVA层用多次查询来完成。
最后的结果是:首先要连用2次 LEFT JOIN 构造一张表,然后做为子查询放到UPDATE语句中作为筛选条件。
要是SQL SERVER数据库,直接用update .....from.(子查询) on ....这样的语句就可以了。
今天鼓捣了半天,一直出不来,搜索了下,我X,原来ORACLE不支持 UPDATE.... 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);
执行之后
在执行前面的语句就能成功。
”
试了一会,果然行不通。我这次的情况是把子查询做为筛选,这个是把另一张实体表做为筛选条件。还是老实用另一种看上去麻烦的语句吧。
语句结构是这样的:
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`与`FOR UPDATE OF`之间的区别,并通过具体的示例来帮助理解这两种锁...
标准 Update 语句是 Oracle 中最基本的更新语句,语法为:`UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值`。例如:`UPDATE t_join_situation SET join_state='1' WHERE year='2011'`。这种方式适用于更新...
在Oracle数据库中,多表关联的UPDATE语句用于更新一个表中的数据,这些数据依赖于另一个或多个表的记录。这种操作在数据整合、错误修正或者数据同步时非常常见。以下我们将详细探讨如何使用不同方式执行多表关联的...
在本篇文档中,作者详细总结了在实际项目中针对Oracle数据库的update语句优化的四种方案。以下是对这四种方案的知识点进行详细的阐述: 1. 标准update语法优化: 当面对单表更新或较简单的SQL语句时,可以直接使用...
Oracle数据库中的多表关联UPDATE语句是用于在一个表中更新数据时,依据另一个表的条件进行操作的关键技术。这在处理复杂的数据同步或修正场景时非常有用。在本例中,我们将探讨如何利用多表关联来更新数据,并通过...
今天,我们将讨论 Oracle 中的 Update 语句,包括 Update 语句的基本语法、Update 语句中使用 Select 语句、Update 语句中使用 Join 语句、Insert 语句的使用等。 一、Update 语句的基本语法 Update 语句的基本...
Oracle提供了多种工具和方法来帮助进行性能调优,包括但不限于: - **执行计划分析**:使用`EXPLAIN PLAN`命令可以查看`UPDATE`语句的执行计划,了解数据访问路径、使用的索引以及可能的瓶颈。 - **统计信息收集**:...
在Oracle数据库中,`UPDATE NOWAIT` 是一个用于事务处理的关键字,它允许你更新一行数据,但在数据被其他事务锁定时,它不会等待而是立即返回一个错误信息。这个特性对于处理多线程并发和确保数据一致性至关重要。...
本文将详细介绍Oracle中实现批量更新的四种常见方法,并通过示例代码来具体说明每种方法的应用场景及优缺点。 #### 二、方法一:直接SQL更新语句 **定义:** 最直观的方法是直接使用SQL更新语句来进行批量更新。 ``...
Oracle是世界上最广泛使用的数据库管理系统之一,尤其在企业级应用中占据重要地位。Oracle数据库提供了丰富的功能,包括数据存储、查询、事务处理、安全性等。在本文中,我们将深入探讨Oracle的使用,特别是通过...
Oracle 游标使用方法及语法大全 Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动...
本文主要探讨了Oracle游标中的多表UPDATE行锁及其解决方案。 Oracle的锁定机制主要包括共享封锁、独占封锁和共享更新封锁。共享更新封锁是一种行级封锁,它允许用户在获取锁定的数据行上进行读取和更新,但阻止其他...
在Oracle数据库管理中,UPDATE语句是用于修改现有数据表中的记录。然而,不恰当的UPDATE操作可能会导致性能问题,特别是在处理大量数据时。本文将深入探讨如何优化Oracle数据库中的UPDATE语句,以提高数据库效率。 ...
shell连接oracle数据库工具脚本:支持select/insert/update/delete 部署位置:/root/sysmonitor db:数据库文件夹 dbconfig.properties:数据库配置文件, dbConnectTest.sh:连接测试文件 dbExecurteSQL.sh:...
### 更改Oracle表中字段顺序的方法 在Oracle数据库管理中,有时我们可能需要对表中的字段顺序进行调整。然而,通常的做法是通过备份、删除原表并重建来达到这一目的,这种方法不仅耗时而且繁琐。幸运的是,经过一番...
在Oracle数据库中,触发器(Triggers)是一种存储过程,它们自动执行,当特定的数据库事件发生时,如INSERT、UPDATE或DELETE操作。调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的...
这里需要注意的是,`UPDATE`后的表名`Ttest`不能使用别名,而`FROM`后的`Tparent`则使用了`parent`作为别名以区分不同的表实例。`WHERE`子句中的`Ttest.id = 123`确保我们找到要更新的特定`Ttest`记录,`Ttest....
### Oracle中的子查询详解 #### 一、子查询概述与应用场景 子查询是SQL语言中一项非常重要的功能,它允许我们在一个查询语句中嵌入另一个查询语句,以此来解决复杂的查询问题。子查询可以极大地提高SQL语言的灵活...
在Oracle数据库中,表结构的设计是数据库管理的重要环节。一旦设计完成后,有时因需求变化,我们需要在已有的表中添加新的字段或者调整字段顺序。本文将详细介绍如何在Oracle数据库中修改表字段的顺序。 首先,让...