update fb_ba_factdata n set n.field55=(SELECT case when n.sapitemid is not null then 
(SELECT  max(t.field57)
FROM FB_BA_FACTDATA t WHERE  t.TableID='ZVXSZLJSB4'  AND  t.itemid = n.sapitemid and t.companyid=n.companyid and t.accyear=n.accyear and t.accperiod=n.accperiod )
else  
(select nvl(n.Field52,0)*nvl(n.field53 ,0)*nvl(n.field54,0) FROM FB_BA_FACTDATA t WHERE t.tableid=n.tableid and  n.itemid = t.itemid  and t.companyid=n.companyid and t.accyear=n.accyear and t.accperiod=n.accperiod)
end  
from dual)
WHERE n.tableid='10PROBUD' and n.companyid='03' and n.accyear='2008' and n.accperiod='04'
可以看到上面最外层可以update 多个不同itemid的纪录,但此时会出现错误:ora-01438:值大于此列指定的允许精确度但如果外层update加上n.itemid='<具体某一列值>' 那么这条语句不会抱错
其中子查询都是查到一条纪录。请各位it届高手指导!! 小女子在此谢过

解决方案 »

  1.   

    没看太懂,我理解是1.用了具体值的n.itemid没问题,但子查询都是查到一条记录,
    2.不用具体值就会报错...第一个问题
    n.itemid看来是主键,它都是一个值,子查询条件一样,肯定只有一个值.
    第二个问题
    肯定有以某些n.itemid查出来的值超出了update列的精度,
    而那个具体值刚好没有超出精度.应该确认n.field55精度,把子查询结果round一下就好了.
      

  2.   

    我发现原因了,是case语句中不能用运算符。加sign(nvl(n.Field52,0)*nvl(n.field53 ,0)*nvl(n.field54,0))就对了,可能写的不是太清楚,多谢楼上的回复,加分~~~