sql*plus下呢?
update bfrbhz set sjkfc=(select a.sjkfc 
(select sjkfc from bfrb where RQ between '2003-01-01' and '2003-12-31' and bf=bfrbhz.bf  order by rq desc) a 
where rownum=1);

解决方案 »

  1.   

    有可能是时间格式的问题,主要看nls_date_format的设置保险起见,用to_date('2003-01-01','yyyy-mm-dd')转换一下测试纪录:
    SQL> select 1 from dual where trunc(sysdate)='2003-07-30';
    select 1 from dual where trunc(sysdate)='2003-07-30'
                                            *
    ERROR 位于第 1 行:
    ORA-01861: 文字与格式字符串不匹配
    已用时间:  00: 00: 00.30
    SQL> select 1 from dual where trunc(sysdate)='30-7月 -03';         1
    ----------
             1已用时间:  00: 00: 00.40
    SQL> alter session set nls_date_format='yyyy-mm-dd';会话已更改。已用时间:  00: 00: 00.20
    SQL> select 1 from dual where trunc(sysdate)='2003-07-30';         1
    ----------
             1已用时间:  00: 00: 00.80
    SQL> 
      

  2.   

    有可能是时间格式的问题,主要看nls_date_format的设置保险起见,用to_date('2003-01-01','yyyy-mm-dd')转换一下测试纪录:
    SQL> select 1 from dual where trunc(sysdate)='2003-07-30';
    select 1 from dual where trunc(sysdate)='2003-07-30'
                                            *
    ERROR 位于第 1 行:
    ORA-01861: 文字与格式字符串不匹配
    已用时间:  00: 00: 00.30
    SQL> select 1 from dual where trunc(sysdate)='30-7月 -03';         1
    ----------
             1已用时间:  00: 00: 00.40
    SQL> alter session set nls_date_format='yyyy-mm-dd';会话已更改。已用时间:  00: 00: 00.20
    SQL> select 1 from dual where trunc(sysdate)='2003-07-30';         1
    ----------
             1已用时间:  00: 00: 00.80
    SQL> 
      

  3.   

    to yuanscar(塑料树) :日期格式不用变,我的RQ 字段是字符型
    to bzszp(SongZip) :是不是应该是....sjkfc=(select a.sjkfc  from .....
                        您好像少了一个from
                      如果改成这样,toad提示:ORA-00904: 无效列名
      

  4.   

    另:在SQL plus下的提示和TOAD一致,我发觉,只要去掉了order by rq desc之后,就好了,
    似乎ORACLE在此种情况下不允许用order by
      

  5.   

    YUP,这种SubSelect里面不支持order by 和group ....
      

  6.   

    YUP,这种SubSelect里面不支持order by 和group ....
      

  7.   

    看来是这个样了
    不过就不能用rownum=1来取最大的一条了
    这样就只能通过 rq =( select max(rq) from tbname where ...)麻烦~
      

  8.   

    to  bzszp(SongZip) :我就是这样做的
    update bfrbhz set sjkfc=(select nvl(sjkfc,0) from bfrb where rq=(select max(rq) from bfrb  where trim(RQ) between '2003-01-01' and '2003-12-31' and trim(bf)=bfrbhz.bf   and rownum=1) and trim(bf)=bfrbhz.bf)
    但我觉得,在SQL Server很轻松实现的,但在ORACLE就得这么费周折?
      

  9.   

    update bfrbhz set sjkfc=(select nvl(sjkfc,0) from bfrb where rq=(select max(rq) from bfrb  where trim(RQ) between '2003-01-01' and '2003-12-31' and trim(bf)=bfrbhz.bf ) and trim(bf)=bfrbhz.bf),
      

  10.   

    你是从T-sql到PL/SQL怎么能一样呢,你要是转到db2上更麻烦
      

  11.   

    这样行吗?
    update bfrbhz set sjkfc=(select a.sjkfc 
    (select sjkfc,bf from bfrb where RQ between '2003-01-01' and '2003-12-31' order by rq desc) a where rownum=1 and a.bf=bfrbhz.bf);
    或者
    update bfrbhz set sjkfc=(select a.sjkfc  from (select bf,sjkfc,rank() over(order by rq desc) rk from bfrb where RQ between '2003-01-01' and '2003-12-31') a where a.bf=bfrbhz.bf and rk=1)
      

  12.   

    to beckhambobo(beckham) :
       这样两层子查询的话,会提示,无效列名的
      

  13.   

    to snowy_howe:
    8i
    8.1.5
      

  14.   

    update bfrbhz set sjkfc=(select a.sjkfc from bfrbhz a,bfrb b
    where    a.bf=b.bf and 
             to_char(to_date(a.rq,'yyyymmdd'),'yyyymmdd') between '20030101' and '20031231'  and
     to_char(to_date(a.rq,'yyyymmdd'),'yyyymmdd')= (select to_char(to_date(max(rq),'yyyymmdd'),'yyyymmdd') from bfrb);
      

  15.   

    重新修改如下:
    update bfrbhz set sjkfc=(select a.sjkfc from 
    (select sjkfc,bf from bfrb where RQ between '2003-01-01' and '2003-12-31' order by rq desc) a where rownum=1 and a.bf=bfrbhz.bf);
    或者
    update bfrbhz set sjkfc=(select a.sjkfc  from (select bf,sjkfc,rank() over(order by rq desc) rk from bfrb where RQ between '2003-01-01' and '2003-12-31') a where a.bf=bfrbhz.bf and a.rk=1)
      

  16.   

    to beckhambobo:
      第一个OK,
      第二个:ORA-00923: 未找到预期 FROM 关键字