请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列

时间:2020-12-20 10:35:58
我在使用Oracle子查询更新表时报错:无法修改与非键值保存表对应的列,报错截图如下:
请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列

两个表,如下图:
请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列

建表语句如下:
create table test1(id1 int,id2 int,col1 int,col2 int);
create table test2(id1 int,id2 int,v1 int,v2 int);


初始化数据:
insert into test1(id1,id2,col1,col2)values(11,12,1001,1002);
insert into test1(id1,id2,col1,col2)values(13,14,1003,1004);
insert into test1(id1,id2,col1,col2)values(15,16,1005,1006);

insert into test2(id1,id2,v1,v2)    values(21,22,2001,2002);
insert into test2(id1,id2,v1,v2)    values(23,24,2003,2004);
insert into test2(id1,id2,v1,v2)    values(25,26,2005,2006);
insert into test2(id1,id2,v1,v2)    values(27,28,2007,2008);

【要求】:使用 子查询更新表test1,即,将表test1中的col1字段修改为test2中的v1值;更新条件是test1.id1=test2.id1 and test1.id2=test2.id2。

我的sql语句如下(执行报错,但是不知道原因):

update(
      select t1.col1,tt.v1 from test1 t1, 
      ( select id1,id2,max(v1)v1 from test2 t2
              group by id1,id2
       )tt where t1.id1=tt.id1 and t1.id2=tt.id2      
)t set t.col1=t.v1;

报错截图如下:
请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列

请问这种条件如何使用Oracle中的“子查询更新表”这种语法呢?
希望哪位能帮忙解决一下,谢谢了!

3 个解决方案

#1


1、test2表加唯一性索引
2、oracle11之前的版本可以 update(
      select   /*+ BYPASS_UJVC */   t1.col1 ........

#2


请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列
oracle 12C 版本不会报错,能正常执行。
oracle 11.2版本 报错跟你的一样。 请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列
应该是12C以上才支持你这种写法了。

#3


用merge  然后用rowid 匹配更新

#1


1、test2表加唯一性索引
2、oracle11之前的版本可以 update(
      select   /*+ BYPASS_UJVC */   t1.col1 ........

#2


请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列
oracle 12C 版本不会报错,能正常执行。
oracle 11.2版本 报错跟你的一样。 请教大家一个Oracle子查询更新表的问题:无法修改与非键值保存表对应的列
应该是12C以上才支持你这种写法了。

#3


用merge  然后用rowid 匹配更新