两个表,如下图:
建表语句如下:
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中的“子查询更新表”这种语法呢?
希望哪位能帮忙解决一下,谢谢了!
3 个解决方案
#1
1、test2表加唯一性索引
2、oracle11之前的版本可以 update(
select /*+ BYPASS_UJVC */ t1.col1 ........
2、oracle11之前的版本可以 update(
select /*+ BYPASS_UJVC */ t1.col1 ........
#2
oracle 12C 版本不会报错,能正常执行。
oracle 11.2版本 报错跟你的一样。
应该是12C以上才支持你这种写法了。
#3
用merge 然后用rowid 匹配更新
#1
1、test2表加唯一性索引
2、oracle11之前的版本可以 update(
select /*+ BYPASS_UJVC */ t1.col1 ........
2、oracle11之前的版本可以 update(
select /*+ BYPASS_UJVC */ t1.col1 ........
#2
oracle 12C 版本不会报错,能正常执行。
oracle 11.2版本 报错跟你的一样。
应该是12C以上才支持你这种写法了。
#3
用merge 然后用rowid 匹配更新