drop table course;
create table course (
id integer,
teacherNo integer,
teacherDesc varchar2(100),
teacherName varchar2(50),
courseName varchar2(50)
);
insert into course values(1,100,'Mr.zhang','ZhangSan','English');
insert into course values(2,101,'Mr.wang','WangWu','History');
insert into course values(2,101,'Mr.wang','WangWu','Chinese'); update course set teacherDesc='Good Teacher' where teacherNo=101;
commit;
drop table teacher;
create table teacher(
id integer,
teacherDesc varchar2(100),
teacherName varchar2(50)
);
insert into teacher values(100,'Mr.zhang','ZhangSan');
insert into teacher values(101,'Mr.wang','WangWu');
update teacher set teacherDesc='Excellent Teacher' where id=101;
commit;
select c.teacherdesc, c.teachername, t.teacherdesc, t.teachername
from course c, teacher t
where c.teacherno = t.id
and (c.teacherdesc != t.teacherdesc or c.teachername != t.teachername); update course c
set (c.teacherdesc, c.teachername) =
(select t.teacherdesc, t.teachername
from teacher t
where c.teacherno = t.id
and (c.teacherdesc != t.teacherdesc or
c.teachername !=
t.teachername))
where exists (select 1
from teacher t
where c.teacherno = t.id
and (c.teacherdesc != t.teacherdesc or
c.teachername != t.teachername));
commit;
select c.teacherdesc, c.teachername, t.teacherdesc, t.teachername
from course c, teacher t
where c.teacherno = t.id
and (c.teacherdesc != t.teacherdesc or c.teachername != t.teachername); select c.teacherdesc, c.teachername, t.teacherdesc, t.teachername
from course c, teacher t
where c.teacherno = t.id;   


update时报ORA-01779:
数据准备:

CREATE TABLE test1 ( id integer primary key, num integer );
INSERT INTO test1 VALUES (1,0);
INSERT INTO test1 VALUES (2,0);
INSERT INTO test1 VALUES (3,0);
INSERT INTO test1 VALUES (4,0); CREATE TABLE test2 ( id integer, num integer, upd integer );
INSERT INTO test2 VALUES (1,10, 0);
INSERT INTO test2 VALUES (2,20, 1); commit;

执行如下更新语句会报错:ORA-01779: 无法修改与非键值保存表对应的列
01779, 00000, "cannot modify a column which maps to a non key-preserved table"
// *Cause: An attempt was made to insert or update columns of a join view which
//        map to a non-key-preserved table.
// *Action: Modify the underlying base tables directly.

UPDATE (SELECT T1.ID ID1, T1.NUM NUM1, T2.ID ID2, T2.NUM NUM2
FROM TEST1 T1, TEST2 T2
WHERE T1.ID = T2.ID
AND T2.UPD = 1)
SET NUM1 = NUM2;

这个错误的意思是,子查询的结果中,更新数据源(test2)的内容不唯一,导致被更新对象(test1)中的一行可能对应数据源(test2)中的多行。
本例中,test2表的id不唯一,因此test2表中可能存在id相同但是num不相同的数据,这种数据是无法用来更新 test1 的。【这个报错属于事前检查,没有通过校验】

解决方法就是保证数据源的唯一性,例如本例中可以为test2.id创建一个唯一索引:

CREATE UNIQUE INDEX test2_idx_001 ON test2 (id);

之后上面的更新就可以执行了。
也可以使用如下命令来使用test2中记录具有唯一性

alter table test2 modify id unique;

另外也可以强制 Oracle 执行,方法是加上 BYPASS_UJVC 注释。

UPDATE (SELECT /*+ BYPASS_UJVC */
T1.ID ID1, T1.NUM NUM1, T2.ID ID2, T2.NUM NUM2
FROM TEST1 T1, TEST2 T2
WHERE T1.ID = T2.ID
AND T2.UPD = 1)
SET NUM1 = NUM2;

BYPASS_UJVC的作用是跳过Oracle的键检查。
这样虽然能够执行了,但是如果test2中存在不唯一的数据,test1就会被更新多次而导致意想不到的结果。【有风险,不建议使用】  

http://www.linuxidc.com/Linux/2012-08/69089.htm

Oracle 多表关联更新的更多相关文章

  1. ORACLE 两表关联更新三种方式

    不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...

  2. Oracle\MS SQL Server Update多表关联更新

    原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...

  3. oracle多表关联删除数据表记录方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  4. MySQL 多表关联更新及删除

    目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一.      多表关联更新 问题 ...

  5. oracle 两表关联查询

      oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...

  6. oracle多表关联查询和子查询

    oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...

  7. oracle多表关联删除的两种方法

    oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...

  8. 数据库MySQL中关于“多表关联更新”的那些事

    在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...

  9. Oracle SQL性能优化 - 根据大表关联更新小表

    需求: 小表数据量20w条左右,大表数据量在4kw条左右,需要根据大表筛选出150w条左右的数据并关联更新小表中5k左右的数据. 性能问题: 对筛选条件中涉及的字段加index后,如下常规的updat ...

随机推荐

  1. ASP.NET回车提交事务

    浅析ASP.NET回车提交事件[转] ASP.NET回车提交事件其实说到底并不是ASP.NET 的编程问题,却是关于html form 中的submit 按钮就是如何规划的具体讨论. 也可归于ASP. ...

  2. oracle查询和编写数据字典

    在项目交付时假设须要编写数据字典,能够採用以下的方法.首先执行以下的sql语句 SELECT A.TABLE_NAME AS 表名, A.COLUMN_NAME AS 字段名, DECODE(A.CH ...

  3. Java引进和应用的包装类

    Java介绍包装类: 于Java它设计主张的想法,也就是说,一切都是对象.但是,我们知道,,Java数据类型分为基本数据类型和引用数据类型,但基本的数据怎么能成对象?为了解决这个问题,对需要8一个类的 ...

  4. Scripting Java #3:Groovy与invokedynamic

    只需看看今天Groovy语言实现机制.在此之前,是第一个推倒静态类型与动态类型语言在实现上面的一些差异. 静态类型 vs. 动态类型 看以下这个简单的栗子. def addtwo(a, b) { re ...

  5. effective c++ 条款3 use const whereever you can

    1 const 传达的意思应该是这个变量是常量不能更改 2 const 在 * 左边表示数据是const,在右边表示指针是const // char greeting[] = "hello& ...

  6. Xamarin.Android 入门实例(1)之获取与解析JSON

    1.Main.axml 视图界面 2.视图代码 <?xml version="1.0" encoding="utf-8"?> <LinearL ...

  7. [Django] Base class in the model layer

    In the model layer, the Model class is the base class while the ModelBase class is metaclass.

  8. android性能测试内存泄漏

    1.什么是内存泄漏?     适用于该系统的内存使用内存泄漏,未回复(释放),该内存可以没有事业,也不能被其他人使用使用自己. 2.出有什么差别?    内存泄漏是分配出去的内存无法回收.    内存 ...

  9. cocos2dx 3.0 学习笔记 引用cocostudio库 的环境配置

    cocostudio创建UI并应用时须要引用cocostudio库,须要额外的环境配置: 之前已经搭配好了基础的开发环境,包含 1) JDK 2) Python 2.7 3) ant 4) visua ...

  10. 第七章——DMVs和DMFs(4)——用DMV和DMF监控磁盘IO

    原文:第七章--DMVs和DMFs(4)--用DMV和DMF监控磁盘IO 前言: 本文为本系列最后一篇,作为DBA,你必须经常关注磁盘的I/O问题,一旦出现问题,要尽快分析出是什么问题.SQLServ ...