日期:2014-05-17  浏览次数:20701 次

寻一更新SQL
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 id3

B表
bb cc
-------
m id1
n id2

结果要
A表
aa cc
--------
xx_m id1
yy_n id2
zz id3

问:
1.这种用一条sql可以写出来吗?
2.如果可以的话,怎么写呢?
3.如果不可以的话,为什么呢?


------解决方案--------------------
update A set aa=A.aa||'_'||(select B.bb from B where b.cc=A.cc);
------解决方案--------------------
update A c 
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)
------解决方案--------------------
A表和B表的ID如果存在一条记录不对应,
那么更新出来的就会为空.
如果加上exists 就不会出现这个问题.

即是有则更新,无则不动.

你可以把exists去掉再试一下在样的情况
A表
aa01 1
aa02 2
aa03 3

B表
bb01 1
bb02 2
bb04 4

刚看了一下
2楼的写法改一下:
update A set a=A.a || (select '_' || B.b from B where b.c=A.c);
也可以满足你的需求.
------解决方案--------------------
平时也经常做这样的操作,我刚才测试了下,给两种常用办法(限制于通过A的一条记录,通过关联条件,只能在B中找到一条唯一的记录):
方法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的视图,运行相互内容借鉴修改。