oracle中有两个表a表:
IDNUM SNAME
1  wuxi
2  shanghai
3  zhagnjiakang
4  changzhoub表:
IDNUM CLIENTNAME REMARKED
1               hhh
2            hhh
3  update b set clientname = (select sname from a where a.idnum= b.idnum) 
where reed = 'hhh';(select sname from a where a.idnum= b.idnum)这句中的b是带where reed = 'hhh' 之后的表呢,还是就是b表本身?set clientname后面不是只能带一个值吗?比如 clientname = (aaaa)是对的,clientname = (aaaa,bbbb)肯定错呀,能不能讲下 上面update的执行顺序?
Oracleselectupdate

解决方案 »

  1.   

    如果放在外面,则是update更新行的条件,即更新哪些行
    放在里面,则是更新内容的条件。
      

  2.   

    where就是过滤,肯定得先过滤不需要更新的了。clientname = (aaaa,bbbb),这必须错啊,字符串得用''
      

  3.   

    update b set clientname = (select sname from a where a.idnum= 1) where reed = 'hhh';
    update b set clientname = (select sname from a where a.idnum= 2) where reed = 'hhh';
    update b set clientname = (select sname from a where a.idnum= 3) where reed = 'hhh';1,2,3是什么?b每行的b.idnum。所以update b set clientname = (select sname from a where a.idnum= b.idnum) where reed = 'hhh';
      

  4.   


    实践告诉你 ,语句肯定没有错,下面就是结果。
    IDNUM CLIENTNAME REMARKED
    1            wuxi    hhh
    2        shanghai    hhh
      

  5.   


    是不是可以这样理解,先过滤掉b表中reed值不是'hhh'的记录,相当于得到一张新的表,就是需要更新的行,然后从第一条遍历直到最后一条记录。
    因为a表中第一条的idnum的值是1,所以 根据条件 把b表中的第一条更新为wuxi;
    因为a表中第二条的idnum的值是2,所以 根据条件 把b表中的第二条更新为shanghai;
      

  6.   

    update b set clientname = (select sname from a where a.idnum= 1) where reed = 'hhh';
    这样的话,一下更新了两行,就是把'hhh'的两行都更新为同一个值了。
      

  7.   


    是不是可以这样理解,先过滤掉b表中reed值不是'hhh'的记录,相当于得到一张新的表,就是需要更新的行,然后从第一条遍历直到最后一条记录。
    因为a表中第一条的idnum的值是1,所以 根据条件 把b表中的第一条更新为wuxi;
    因为a表中第二条的idnum的值是2,所以 根据条件 把b表中的第二条更新为shanghai;是这个意思