问题如下:
表:T1
学号 姓名 成绩
003  张三 30
004  李四 40
005  王五 50表:T2
学号 姓名   成绩
003  张小三 30.3
004  李小四 40.4更新SQL文:
update T1
set   (T1.姓名, T1.成绩)
=     (select T2.姓名, T2.成绩
       from   T2
       where  T2.学号 = T1.学号)请问执行后的表T1应该是如下哪一种:
① T1:
学号 姓名 成绩
003  张小三 30.3
004  李小四 40.4
005  王五 50② T1:
学号 姓名   成绩
003  张小三 30.3
004  李小四 40.4
005  Null   Null如果结果是②,但我想获得① 那样的结果的话,正确的sql应该如何写(尽量简练)?谢谢。

解决方案 »

  1.   


    10G 下 
    MERGE INTO t1 
         USING t2 
         ON (t1.学号 = t2.学号)
         WHEN MATCHED THEN
         UPDATE
         SET t1.姓名 = nvl(t2.姓名,t1.姓名),
         t1.成绩 = nvl(t2.成绩,t1.成绩);9I下必须加上 
    WHEN NOT MATCHED THEN如下
    MERGE INTO t1 
         USING t2 
         ON (t1.学号 = t2.学号)
         WHEN MATCHED THEN
         UPDATE
         SET t1.姓名 = nvl(t2.姓名,t1.姓名),
         t1.成绩 = nvl(t2.成绩,t1.成绩)
         WHEN NOT MATCHED THEN
          -- 插入一些空语句 然后更新完删除
    ;
      

  2.   

    我本身知道一种正确写法,但觉得有些啰嗦:
    update T1
    set (T1.姓名, T1.成绩)
    = (select T2.姓名, T2.成绩
      from T2
      where T2.学号 = T1.学号)
    where exists (select 1 from T2 where T2.学号 = T1.学号)
      

  3.   


    你的写法肯定是第二种结果的 想第一种的话 后面加个 exists update t1 set (姓名,成绩)=(select 姓名,成绩 from t2 where t1.学号=学号)
     where exists(select 1 from t2 where t1.学号=t2.学号)--也可以用10g的新关键字 merge into
    merge into t1 using t2 on(t1.学号=t2.学号)
    when matched then update set (t1.姓名=t2.姓名,t1.成绩=t2.成绩)
      

  4.   


    但是如果这样写的话,“from T2 where T2.学号 = T1.学号”这个部分就等于写了两遍,有些繁琐了好像。。
      

  5.   

    UPDATE 好像就是这写法了 ,要不你就用 MERGE INTO