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.如果不可以的话,为什么呢?

解决方案 »

  1.   

    update A set aa=A.aa||'_'||(select B.bb from B where b.cc=A.cc);
      

  2.   

    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)
      

  3.   

    恩,对的。
    和这个语句有什么区别呢?
    UPDATE A t SET t.aa = (SELECT A.Aa ||'_'||b.bb FROM A,B
    WHERE a.cc = b.cc);
      

  4.   

    A表和B表的ID如果存在一条记录不对应,
    那么更新出来的就会为空.
    如果加上exists 就不会出现这个问题.即是有则更新,无则不动.你可以把exists去掉再试一下在样的情况
    A表
    aa01  1
    aa02  2
    aa03  3B表
    bb01  1
    bb02  2
    bb04  4
      

  5.   

    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 1 from A a, B b where a.c = b.c and c.a = a.a)
      

  6.   

    A表和B表的ID如果存在一条记录不对应,
    那么更新出来的就会为空.
    如果加上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);
    也可以满足你的需求.
      

  7.   

    既然能確定A表和B表cc字段为唯一值那么就没有区别
      

  8.   

    还是有的,UPDATE A t SET t.aa = (SELECT A.Aa ||'_'||b.bb FROM A,B
    WHERE a.cc = b .cc);
    这种效率没有加EXISTS高
    因为EXISTS判断不存在就不执行了
    而上面这个每条都要执行,都要写入数据文件和重做日志文件。
    所以建议使用带EXISTS的.那个SQL还可以优化,你自己看看吧.
      

  9.   

    其实,用UPDATE A t SET t.aa = (SELECT A.Aa ||'_'||b.bb FROM A,B
    WHERE a.cc = b .cc)这个sql,会报错误的。因为,后面的(SELECT A.Aa ||'_'||b.bb FROM A,B
    WHERE a.cc = b .cc)会搜出多条记录,不知道ls的试了没有?
      

  10.   

    update a set aa =  aa || '_' || (select bb from b where a.cc = b.cc)
    where a.cc in (select b.cc from b);
      

  11.   

    恩。ls是对的。
    我想问下 1L和4L的两个SQL的区别。
      

  12.   

    平时也经常做这样的操作,我刚才测试了下,给两种常用办法(限制于通过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的视图,运行相互内容借鉴修改。