Oracle 多表关联更新
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 多表关联更新的更多相关文章
- ORACLE 两表关联更新三种方式
不多说了,我们来做实验吧. 创建如下表数据 select * from t1 ; select * from t2; 现需求:参照T2表,修改T1表,修改条件为两表的fname列内容一致. 方式1,u ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- oracle多表关联删除数据表记录方法
oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...
- MySQL 多表关联更新及删除
目录: <MySQL中的两种临时表> <MySQL 多表关联更新及删除> <mysql查询优化之三:查询优化器提示(hint)> 一. 多表关联更新 问题 ...
- oracle 两表关联查询
oracle 两表关联查询 CreationTime--2018年7月4日17点27分 Author:Marydon 情景描述 查询学生表student,sname,sex,age信息及所在班级c ...
- oracle多表关联查询和子查询
oracle多表关联查询和子查询 一.多表关联查询 例子: SQL> create table student1 ( sid ), sname ), sage )); Table created ...
- oracle多表关联删除的两种方法
oracle多表关联删除的两种方法 第一种使用exists方法 delete from tableA where exits ( select 1 from tableB Where tableA.i ...
- 数据库MySQL中关于“多表关联更新”的那些事
在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...
- Oracle SQL性能优化 - 根据大表关联更新小表
需求: 小表数据量20w条左右,大表数据量在4kw条左右,需要根据大表筛选出150w条左右的数据并关联更新小表中5k左右的数据. 性能问题: 对筛选条件中涉及的字段加index后,如下常规的updat ...
随机推荐
- 浏览器被劫持到http://hao.169x.cn/?v=108的解决办法
不管什么浏览器打开都是 http://hao.169x.cn/?v=108 1.下载wmi tool,(微软官网下载,我的下载地址是: http://120.52.73.52/download.mi ...
- C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法。
原文:C# Windows Phone 8 WP8 开发,取得手机萤幕大小两种方法. 一般我们在开发Windows Phone App时,需要取得萤幕的大小来自定义最佳化控制项的大小,但是开如何取得萤 ...
- [Windows Phone] 导览控制项(Navigation controls)
原文:[Windows Phone] 导览控制项(Navigation controls) [前言] 如果应用程式只有单一页面,在画面呈现上可能会让使用者容易没有新鲜感,这个范例是使用导览控制项(Na ...
- Java执行批处理.bat文件(有问题???求高手帮忙解答!!!)
Java执行批处理.bat文件(有问题???求高手帮忙解答!!!) 在项目开发中常常都会遇到需要在代码中调用批处理bat脚本,把自己在项目中遇到过的总结下 ...
- 无法识别的属性“targetFramework”。请注意,属性名是大写和小写。错误的解决方案
"/CRM"应用server错. 配置错误 说明: 在处理向该请求提供服务所需的配置文件时出错.请检查以下的特定错误具体信息并适当地改动配置文件. 分析器错误消息: 无法识别的属性 ...
- 【Python项目】配合爱漫画爬取漫画脚本而设计的GUI漫画阅读器 (一)
博客园的第一个坑,想想都有点小激动 =3= 首先是那个爬虫的地址: [原创]最近写的一个比较hack的小爬虫 选择工具: 以前用过Qt,那么选pyqt4也就是情理之中了. 明确需求: 0.首先,要读取 ...
- PhoneGap 开发与应用 上传 App Store 在
几个简单的归纳过程,前提是你有一个开发者账户,而且必须有Mac 虚拟机或真机.尽管WIndows 也可以上载证书.但最终也必须用于上传应用程序 Xcode 要么 Application Loader ...
- cocos2d-x路~使得第一个字游戏(一个)
前言 去年的回忆.另外,在第三.他们开发了他们的第一场比赛四月,它是游戏.所以我决定走上独立开发的道路上.了.第一款游戏达到它应有的盈利水平.然而这款游戏开发后的时间里.都没再取得还有一款令自己惬意的 ...
- QlikView同button控制转换图表类型(例如,变成一个垂直的条形图)
QlikView图表可以通过检查一些可以为图表类型的转换非常方便进行配置,允许用户选择上面的图就是看条形图或柱状图或垂直方向图detail数据. 在Fast Type Change中选中如上图所看到的 ...
- FileZilla 错误425 Can't open data connection 读取目录列表失败
新装FileZilla FTP Server,设置好后,客户端能连接,但是出Error:[读取目录列表失败]:同时,服务端出Error:[425 Can't open data connection] ...