table A: sutdent_no, grade,come
table B: student_no, score现在A中有两条数据   001,0.00
                    002,0.00
    B中有一条数据   001,200.00要对A中come为 bj 的学生进行更新,若A中的学生在B中有记录,则把其grade更新为B中的score 我的语句是  
              UPDATE A SET (GRADE)=(
                                    SELECT B.SCORE FROM B
                                    WHERE A.STUDENT_NO=B.STUDENT_NO              )WHERE A.COME='bj' AND EXISTS(
                                            SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO
               );
为什么会更新A中的两条记录,把002,0.00 更新成了 NULL

解决方案 »

  1.   

    UPDATE A SET (GRADE)=(SELECT B.SCORE FROM B WHERE A.STUDENT_NO=B.STUDENT_NO)
    WHERE A.COME='bj' 
    AND EXISTS(SELECT 1 FROM B WHERE A.STUDENT_NO=B.STUDENT_NO)
      

  2.   


    EXISTS(
      SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO
      );
    你的没起作用
      

  3.   


    可以,但是  SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO  和 SELECT 1 FROM B WHERE A.STUDENT_NO=B.STUDENT_NO 结果一样啊  为什么更新的结果不一样了呢 
      

  4.   


    SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO SELECT 1 FROM WHERE A.STUDENT_NO=B.STUDENT_NO
      

  5.   

     SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO 和 SELECT 1 FROM B WHERE A.STUDENT_NO=B.STUDENT_NOexists谓词你还没明白你写的就是一个内部查询 and(SELECT 1 FROM A ,B WHERE A.STUDENT_NO=B.STUDENT_NO) 不管如何都为true  根本没跟你的外层比对
    SELECT 1 FROM B WHERE A.STUDENT_NO=B.STUDENT_NO
    就是跟外层表查数据与里层的b表进行比对  匹配则更新
      

  6.   

    merge into A 
    using B
    on(A.student_mo=B.student_no and A.come='bj')
    when match then
    update set A.grade=B.score 这样可以不~~~
      

  7.   

    什么版本的 9i以上的 merge into 
    merge into A using B on( A.STUDENT_NO=B.STUDENT_NO)
    when matched then
    update set A.GRADE=B.SCORE
    where A.COME='bj'