比如有个表meta_cust中有c_cust_id和c_cust_name、c_state三个字段,有以下4条记录:
c_cust_id   c_cust_name  c_state
001         aaa          1
002         bbb          1
001                      2
002                      2
就是说后面两条记录中的c_cust_name字段为空,怎样才能把后面这两条记录的c_cust_name字段改成和上面的一致。我这样写的SQL语句没有任何反应:update meta_cust a set a.c_cust_name = 
(select b.c_cust_name from meta_cust b 
where b.c_cust_name is not null 
and a.c_cust_id = b.c_cust_id  ) 
where a.c_cust_name is null 

解决方案 »

  1.   

    肯定是NULL吗?不是全是空格什么的?“没有任何反应”的意思,是不是说,没有错误?正常执行完了了?
      

  2.   

    2\表中的c_cust_id字段不空的记录不止一条.想来这个可能性最大. ---------------------------
    确实是有这样的情况,但是即使加上distinct 或者rownum=1也不起作用。
    update meta_cust a set a.c_cust_name =  
    (select distinct b.c_cust_name from meta_cust b  
    where b.c_cust_name is not null  
    and a.c_cust_id = b.c_cust_id  )  
    where a.c_cust_name is null  
    update meta_cust a set a.c_cust_name =  
    (select b.c_cust_name from meta_cust b  
    where b.c_cust_name is not null  
    and a.c_cust_id = b.c_cust_id and rownum=1 )  
    where a.c_cust_name is null  
    没有反应的意思是一条记录也没有更改,语句运行正常。我看了记录还是空的,肯定是NULL。
      

  3.   

    不空的纪录不止一条的话,你这个句子就报错了。难道真的是没有commit?
      

  4.   

    语句没有出错,执行后的提示信息是:0 rows updated in 0 seconds
    每次执行后都commit过的。
      

  5.   

    刚才的看错了,应该是:语句没有出错,执行后的提示信息是:4571 rows updated in 0.078 seconds 
    每次执行后都commit过的。
      

  6.   

    0行?
    这里没有环境,回去测试一下。或者你可以给我一个可以连接的测试环境吗?
    isqlplus也可以呀。
      

  7.   

    2\表中的c_cust_id字段不空的记录不止一条.想来这个可能性最大.  ??不是c_cust_name??更新了,却没有更新成功?你先只用你给出的4条记录,测试看看。
    随便新建一个表。
      

  8.   

    我建了个测试表,结果更新成功了,谢谢Croatia,
    看来问题出在表上面,会不会是锁的问题?
      

  9.   

    嗬嗬,应该不会的。假如锁定的话,你根本更新不了的。假如怀疑是被锁定的话,可以通过V$LOCK,V$SESSION查看一下的。
    个人认为不是这个问题。赫赫。
      

  10.   

    V$LOCKED_OBJECT这个view也可以。能告诉我,你都是在什么地方测试的吗?
    直接在sqlplus里面调用sql语句的?
    这样的话,有点奇怪呢。赫赫。除了没有commit的话,目前还找不出理由。嗬嗬,不是怀疑你的做法,我也想知道为什么会出现这个状况,赫赫。避免以后再遇到同样的问题。
      

  11.   

    我用的是PL/SQL,
    查看了没有被锁住。
      

  12.   

    PL/SQL?自己写的一段程序吗?里面是不是有什么问题呢?
      

  13.   

    PL/SQL里面也可以执行单个的SQL语句,那个表的记录太复杂了,看不出问题出在哪里。