`
langgufu
  • 浏览: 2293847 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle中的 UPDATE FROM 解决方法(更新表时引用其它表的字段)

阅读更多

在表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据。象sql server提供了update的from 子句,可以将要更新的表与其它的数据源连接起来。虽然只能对一个表进行更新,但是通过将要更新的表与其它的数据源连接起来,就可以在update的表达式中引用要更新的表以外的其它数据。
例如:

UPDATE Table2
SET Table2.ColB = Table2.ColB + Table1.ColB
FROM Table2 
INNER JOIN Table1 
ON (Table2.ColA = Table1.ColA);

实际更新的操作是在要更新的表上进行的,而不是在from子句所形成的新的结果集上进行的。


Oracle没有update from语法,可以通过两种写法实现同样的功能:
1:子查询UPDATE A SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID),本查询要根据具体情况看看是否变通成如下
(1)单列
UPDATE A

SET A.NAME=(SELECT B.NAME FROM B WHERE B.ID=A.ID)

WHERE A.ID IN (SELECT ID FROM B);

(2)多列
UPDATE order_rollup

SET(qty,price)=(SELECT SUM(qty),SUM(price) FROM order_lines WHERE customer_id='KOHL' )

WHERE cust_id='KOHL' AND order_period=TO_DATE('01-Oct-2000')


2:利用视图来做
UPDATE (SELECT A.NAME ANAME,B.NAME BNAME FROM A,B WHERE A.ID=B.ID)
SET ANAME=BNAME;

例如:

UPDATE tablea a
SET a.fieldforupdate = (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)
WHERE EXISTS (SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield)

有三点需要注意:
1. 对于一个给定的a.keyfield的值,SELECT b.fieldsource FROM tableb b WHERE a.keyfield = b.keyfield 的值只能是一个唯一值,不能是多值。
2. 在绝大多数情况下,最后面的where EXISTS子句是重要的,否则将得到错误的结果。
3. 对于视图更新的限制:
如果视图基于多个表的连接,那么用户更新(update)视图记录的能力将受到限制。除非update只涉及一个表且视图列中包含了被更新的表的整个主键,否则不能更新视图的基表。

分享到:
评论

相关推荐

    sql server的 update from 语句的深究

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

    ORACLE查询表最近更改数据的方法

    修改项目时,涉及到了Oracle中许多表的修改(包括:增加、删除字段,修改注释等)。由于开始没有进行记录,造成在上测试机时,忘记了具体修改过哪些表了。后来在网上查找了一些资料,例如: 代码如下: 1、select uat...

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

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

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

    依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username...

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

    日期类型 date 7字节 用于存储表中的日期和时间数据,取值范围是公元前4712年1月1日至公元9999年12月31日,7个字节分别表示世纪、年、月、日、时、分和秒 二进制数据类型 row 1~2000字节 可变长二进制数据,在具体...

    MLDN李兴华老师的Oracle上课笔记

    在 Oracle 中,可以使用 CREATE TABLE 语句创建数据表,使用 ALTER TABLE 语句修改数据表,使用 DROP TABLE 语句删除数据表。 8. 约束的设置:约束的设置是指对数据表的字段进行约束,例如 primary key 约束、...

    oracle从一个表中获取数据更新到另一个表(两表无关联关系)

    oracle从一个表中获取数据更新到另一个表(两表无关联关系) 想到的唯一解决办法 行数定义时要和被修改的数据表的行数相同 declare cursor cor is select m.id from 提供数据表 m where rownum<=行数; n_...

    oracle数据库主键自动生成

    在某些情况下,我们可能需要在更新记录时自动更新其他字段的值。可以使用以下语法创建一个更新触发器: ```sql CREATE OR REPLACE TRIGGER 触发器名 BEFORE UPDATE OF name ON 表名 FOR EACH ROW BEGIN :NEW....

    oracle实验报告

    处理方法:利用SQL*PLUS语言工具(也可以使用其他文本编辑器)建立批命令的.SQL文件。在“SQL>”提示符下,使用EDIT命令在”E:\”中建立SCGB.SQL文件。 SCGB.SQL文件中的命令组如下: SQL>EDIT E:\ SCGB.SQL SET ...

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

    她是Oracle ACE,也是OakTable(Oracle社区中著名的“Oracle科学家”的非正式组织)的成员,经常在技术会议上演讲。她的著作还包括 Expert Oracle Practices和Beginning Oracle SQL,博客主页是karenmorton....

    oracle数据库经典题目

    对要更新表的列进行加锁 D. 都不对 21. 如果允许用户对视图进行更新和插入操作,但是又要防止用户将不符合视图约束条件的记录添加到视图,应当在定义视图时指定下列哪一个子句?( C ) A.WITH GRANT OPTION B. ...

    orcale常用命令

    依此类推,就可以轻松知道数据字典的详细名称和解释,不用查看ORACLE的其它文档资料了。 下面按类别列出一些ORACLE用户常用数据字典的查询使用方法。 1、用户 查看当前用户的缺省表空间 SQL>select username...

    Oracle中转义字符的详细介绍

    最近工作中遇到一个需求,需要更新Oracle数据库中所有表的一个字段“flag”为“I”,语句为: update table_name set flag = 'I' “I”作为字符串,所以语句中I需要加上单引号。 由于数据库中有多张表,我不想一条...

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

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

    oracle数据字典制作流程

    Oracle 数据字典是指 Oracle 数据库中的元数据信息,包括表结构、字段信息、索引、视图、存储过程等。数据字典是数据库管理员和开发人员了解数据库结构和数据关系的重要工具。在本文中,我们将介绍使用 ...

    Oracle中在pl/sql developer修改表的2种方法

    student表需要操作人修改完commit之后才可以做其他的操作,否则该表会被锁住。   二、方式二 select t.*,t.rowid from student t 在pl/sql developer中右击某表,显示的就是该语句,这样做不会将该表锁住。 想修改...

    2018教程读书笔记之oracle从入门到精通

    表名,访问当前用户下的表时用户名可省略,访问其他用户下的表就要加上。  最大权限 conn sys/change_on_install as sysdba;  关键词:SELECT、FROM、WHERE、GROUP BY、HAVING、ORDER BY;INSERT、UPDATE、...

    Oracle事例

    当指定时,如果父表中的记录被删除,则依赖于父表的记录也被删除 REFERENCE 表名() on delete cascade; 7、删除带约束的表 Drop table 表名 cascade constraints; 8:索引管理 <1>.creating function-based...

    实验六-触发器实验报告.doc

    在Account表上增加一个行级触发器,当对account的balance进行update和insert一个 记录时同步修改Customer的Savings字段,保证数据的一致性。 4. 对account进行update操作,记录account表和customer表的变化。 5. ...

Global site tag (gtag.js) - Google Analytics