我想更新emp表的第2条-第10条记录,我的代码如下:
update (
               select empno,ename,rn 
               from 
               (select empno,ename,rownum rn from emp)a 
               where (a.rn between 2 and 10)
             ) 
set ename=concat(ename,rn);
但总是提示:ORA-01733: virtual column not allowed here(在这里不允许出现虚拟的列);
请问该怎么做才行呢?

解决方案 »

  1.   

    --写得有点复杂
    merge into emp
    using (select * from (select empno,rownum rn from emp) t
                 where t.rn between 2 and 10) t
    on(t.empno=emp.empno)
    when matched then
    update set
    ename=concat(ename,t.rn)--结果
    SQL> select ename from emp;ENAME
    ----------
    SMITH
    ALLEN2
    WARD3
    JONES4
    MARTIN5
    BLAKE6
    CLARK7
    SCOTT8
    KING9
    TURNER10
    ADAMS
    JAMES
    FORD
    MILLER
      

  2.   

    update emp a set ename=(select ename||rn from (select empno,ename,rownum rn from emp) b 
    where b.rn>=2 and b.rn<=10 and b.empno=a.empno)
    where empno in(select empno  from (select empno,ename,rownum rn from emp) c 
    where c.rn between 2 and 10 )
      

  3.   

    wkc168,我不想用你那种set ename=子查询的方法。。能否像我的思路那样 update 子查询表 set Ename=    ????
      

  4.   

    你那个update子查询表又不是物理存在的表怎么能改呢?
      

  5.   

    rownum rn本来就是伪列 报错已经很明显了  10G的话就用merge into 
    aspen写的那样
      

  6.   

    update(select a.id,b.col colb,a.col cola from tb a,tb2 b where a.id=b.id and rownum=1)
    set cola=colb里面的子查询必须是两个表中存在的
      

  7.   

    update (select a.sal asal,b.sal bsal,a.comm acomm,b.comm bcomm from emp a,emp1 b where a.empno = b.empno)
    set asal = bsal,
    acomm = bcomm;类视图的更新方法,这也是oracle所独有的。先把对应的数据全部抽取出来,然后更新表一样更新数据,这里需要注意的是,必须保证表的数据唯一型。这是我在网上的资料。不过他是两张表连接更新。而我的需求只是变成了一张表。但思路应该都一样,如果像你说的不是物理表所以不能更新的话,那网上的这种方法也不行咯
      

  8.   

    rownum是伪列没错,但我更新的是实列啊,我只是读取rownum rn而已啊
      

  9.   


    update(select a.id,b.col colb,a.col cola from tb a,tb2 b where a.id=b.id and rownum=1)
    set cola=colb里面的子查询的显示结果列必须是两个表中存在的 而且错误已经有很明显的提示了 就是实在的列 不是虚拟的
      

  10.   

     
    aspen的merge into就很好