update (
  
  select   test1.name   as  a1,
   test2.name  as a2  from   test1  left join   test2   test1.id=test2.id )  set  a1 =a2
以前 代码  是不 是   把  test1 里面 的  name  字段的值  更新 成为 test2里的name 字段的值

解决方案 »

  1.   

    有趣!
    create table test1(id number,name varchar2(20));
    create table test2(id number,name varchar2(20));
    insert into test1 values(1,'jiabo');
    insert into test1 values(2,'try');
    insert into test2 values(1,'jiabo');
    insert into test2 values(2,'try');insert into test1 values(4,'notequal');
    insert into test2 values(5,'nothing');
    commit;update (select t1.name a1,t2.name a2 from test1 t1 left join test2 t2 on t1.id=t2.id) set a1 =a2;
      
    select t1.name a1,t2.name a2 from test1 t1 left join test2 t2 on t1.id=t2.id;
    去执行下吧,看能否执行!!!
      

  2.   

    正确,(上面的语句有点小错误,左联结少了关键字on)
    但这种写法必须要求test2中的id必须有唯一约束或主键约束,意即要保持唯一,否则会报错。
    当然,如果没有唯一或主键约束,可以使用hint,bypass_ujvc,但不提倡,如:
    UPDATE /*+bypass_ujvc*/ (SELECT test1.name AS a1, test2.name AS a2
              FROM test1
              LEFT JOIN test2
                ON test1.id = test2.id)
       SET a1 = a2;
    常规写法是:
    UPDATE test1 t
       SET t.name =
           (SELECT a.name FROM test2 a WHERE a.id = t.id)
     WHERE EXISTS (SELECT 1 FROM test2 a WHERE a.id = t.id);