oracle环境,
A表和B表
A表字段aa,cc(唯一)
B表字段bb,cc(唯一)
A表cc字段唯一。
B表cc字段唯一。目的:
更新A表,aa字段的值,更新为A的aa加上'_'再加上B表bb字段的值(即:aa_bb)
条件是A.cc=B.cc。例:
A表
aa cc
-------
xx id1
yy id2
zz id3B表
bb cc
-------
m id1
n id2结果要
A表
aa cc
--------
xx_m id1
yy_n id2
zz id3问:
1.这种用一条sql可以写出来吗?
2.如果可以的话,怎么写呢?
3.如果不可以的话,为什么呢?
A表和B表
A表字段aa,cc(唯一)
B表字段bb,cc(唯一)
A表cc字段唯一。
B表cc字段唯一。目的:
更新A表,aa字段的值,更新为A的aa加上'_'再加上B表bb字段的值(即:aa_bb)
条件是A.cc=B.cc。例:
A表
aa cc
-------
xx id1
yy id2
zz id3B表
bb cc
-------
m id1
n id2结果要
A表
aa cc
--------
xx_m id1
yy_n id2
zz id3问:
1.这种用一条sql可以写出来吗?
2.如果可以的话,怎么写呢?
3.如果不可以的话,为什么呢?
set c.a = (select a.a || '_' || b.b from A a, B b where a.c = b.c and c.a = a.a)
where exists (select a.a || '_' || b.b from A a, B b where a.c = b.c and c.a = a.a)
和这个语句有什么区别呢?
UPDATE A t SET t.aa = (SELECT A.Aa ||'_'||b.bb FROM A,B
WHERE a.cc = b.cc);
那么更新出来的就会为空.
如果加上exists 就不会出现这个问题.即是有则更新,无则不动.你可以把exists去掉再试一下在样的情况
A表
aa01 1
aa02 2
aa03 3B表
bb01 1
bb02 2
bb04 4
set c.a = (select a.a || '_' || b.b from A a, B b where a.c = b.c and c.a = a.a)
where exists (select 1 from A a, B b where a.c = b.c and c.a = a.a)
那么更新出来的就会为空.
如果加上exists 就不会出现这个问题.即是有则更新,无则不动.你可以把exists去掉再试一下在样的情况
A表
aa01 1
aa02 2
aa03 3B表
bb01 1
bb02 2
bb04 4刚看了一下
2楼的写法改一下:
update A set a=A.a || (select '_' || B.b from B where b.c=A.c);
也可以满足你的需求.
WHERE a.cc = b .cc);
这种效率没有加EXISTS高
因为EXISTS判断不存在就不执行了
而上面这个每条都要执行,都要写入数据文件和重做日志文件。
所以建议使用带EXISTS的.那个SQL还可以优化,你自己看看吧.
WHERE a.cc = b .cc)这个sql,会报错误的。因为,后面的(SELECT A.Aa ||'_'||b.bb FROM A,B
WHERE a.cc = b .cc)会搜出多条记录,不知道ls的试了没有?
where a.cc in (select b.cc from b);
我想问下 1L和4L的两个SQL的区别。
方法1(直接修改):
UPDATE A a1
SET a1.aa = (SELECT a1.aa||'_'||a2.bb FROM B a2 WHERE a1.cc=a2.cc);
此方法的关键是将外部的表名称以及列信息可以将其作为常量带到内部SQL中。方法2(视图修改):
UPDATE (SELECT a1.aa,a2.bb FROM A a1,B a2 WHERE a1.cc=a2.cc)
SET aa=aa||'_'||bb;
此方法的关键是先根据条件创建视图并修改试图列,ORACLE对于1对1的视图,运行相互内容借鉴修改。