UPDATE SMSGATEWAY.MessageTablePool 
    SET inCache=1 
    WHERE MESSAGE_ID IN 
    (SELECT DISTINCT MESSAGE_ID FROM SMSGATEWAY.MessageTablePool 
        WHERE REGISTERED=0 AND isToLog=0 AND ROWNUM < 99);

解决方案 »

  1.   

    刚才查了很多资料,发现好像oracle不支持在update里面嵌套order by,不知道谁又比较好的解决方法,郁闷
      

  2.   

    如果不嫌麻烦的话,我想可以现select一个零时的表,然后再对这个表进行操作,完了之后删除原始的表,把临时表该一下名.想想是不是可以这样.
      

  3.   

    to sczyq(我又...........) 兄:
    我就是要不能忽略order by 才郁闷阿,去掉order by 的话,当然肯定能通过的,希望能提供别的方法。
     to  Sherwin(Subsky20XX) 兄:
    别这么说嘛,我也是接触oracle不久的,不过你的方法好像效率太低了,我打算作为没办法的办法,汗。
      

  4.   

    困惑ing.....update 加order by 有什么用处呢 ? 
    即使加了order by ,update 的结果也还是一样的啊.
    楼主只要在 SELECT 时,加上ORDER BY不就行了
      

  5.   

    埃,oracle高手太少了。想学习都没有办法。
      

  6.   

    我不十分明白的你意思,要修改ROWID小于100的行。只要能查出ROWID为100的行就可以了吗?
    应该不难实现吧。
      

  7.   

    to comcn(大XX):update 加order by 有什么用处呢 ? 可能你没有注意到还有 ROWNUM < 99 这句话吧,我的目的是更新排序前99位的纪录。<-------------------------其实只要达到这个目的就行了select作为update的子句的话,一旦包含了order by,oracle就报错,我试过了
      

  8.   

    我再解释一下吧,我要的是
    在 按message_id排序的结果集 中,取前99个记录。“要修改ROWID小于100的行。只要能查出ROWID为100的行就可以了吗?”
    <----这样的话,取到的就是按ROWID排序的前99个记录了
      

  9.   

    将message_id设为主键
    就不用ORCER BY了直接
    UPDATE SMSGATEWAY.MessageTablePool 
        SET inCache=1 
        WHERE REGISTERED=0 AND isToLog=0 AND ROWNUM < 99
      

  10.   

    UPDATE SMSGATEWAY.MessageTablePool 
      SET inCache=1 
      WHERE MESSAGE_ID IN 
        (SELECT MESSAGE_ID 
            FROM (select message_id 
                     from SMSGATEWAY.MessageTablePool 
                     WHERE REGISTERED=0 AND isToLog=0 order by message_id)
            where  ROWNUM < =100 );
      

  11.   

    declare 
    cursor c is SELECT MESSAGE_ID FROM SMSGATEWAY.MessageTablePool 
            WHERE REGISTERED=0 AND isToLog=0 AND ROWNUM < 99 
            ORDER BY message_id for update;
    begin
    open  c;
    loop
    fetch c;
    exit when c%notfound;
    update MessageTablePool set inCache = 1 where current of c;
    end loop;
    close c;
    end;
      

  12.   

    问题已经解决,采用了atao245993(阿涛) 的方法,好像order by 放在update下面或update的select子句下面是不行的,放到select的嵌套select子句下面就好了。
    非常感谢大家,我们公司的ocp都搞不定的问题呢,呵呵
    to w13721():你的存储过程可能是可行的,不过这个项目不用存储过程,所以我没试过,给你的分少点,请别介意^-^。
    to comcn(大XX):我描述的时候把问题简化了一下, 实际上我是对time进行排序的,所以你的方法不适用。
    下面是我使用的最终语句:
    UPDATE SMSGATEWAY.MessageTablePool 
      SET inCache=1 
      WHERE MESSAGE_ID IN 
        (SELECT MESSAGE_ID 
            FROM (select message_id 
                     from SMSGATEWAY.MessageTablePool 
                     WHERE REGISTERED=0 AND isToLog=0 order by Mtime desc)
            where  ROWNUM < 99 );
    现在结贴给分
      

  13.   

    UPDATE SMSGATEWAY.MessageTablePool 
        SET inCache=1 
        WHERE MESSAGE_ID IN 
        (SELECT MESSAGE_ID FROM (SELECT MESSAGE_ID FROM SMSGATEWAY
    WHERE REGISTERED=0 AND isToLog=0 ORDER BY message_id)
             AND ROWNUM < 99 
            );
      

  14.   

    OCP都搞不定?他是怎么混出来的,介绍经验看看?
      

  15.   

    UPDATE SMSGATEWAY.MessageTablePool 
        SET inCache=1 
        WHERE MESSAGE_ID IN 
        (SELECT MESSAGE_ID FROM (SELECT MESSAGE_ID FROM SMSGATEWAY.MessageTablePool 
    WHERE REGISTERED=0 AND isToLog=0 ORDER BY MESSAGE_ID) WHERE ROWNUM < 99 );
      

  16.   

    已经给分完毕。
    to  Croatia(Croatia)兄:估计你自己也没有试验过把,你这句是不行的,希望你下次帮人前先自己测试一下,^-^。另外不要这么说人家嘛,据说ocp强在oracle管理方面,sql语句可能不是强项把
      

  17.   

    我之前的那句没有测试过,因为写错了and,后面的那句测试过。
    我只是觉得,他连这么简单的SQL句子都写不出来,实在不可思议。
    Rownum是Oracle的一个伪列,利用了ROWID,所以,你第一次使用rownum的时候,他是不会给你按照你的order by排序的,但是后来利用了子查询,你的rowid就不再有用,他会按照你的新的记录集重新排序。这个是很简单的SQL的常识,他都不能明白,所以,我才奇怪的。
    我的解释可能不是很确切,建议你,再去看一些,关于rowid,rownum的知识。还有一个就是,你更新的不是100行,只有98行。赫赫。
      

  18.   

    呵呵,我的目的就是要更新98行,前面说的100行是方便大家理解。
    至于ocp的这个...和那个...,^-^,我不置评论。另外小弟主要是作java的。以前接触的都是mysql和sql server居多,这次是有个项目要从mysql移植到oracle,才这样伤脑筋的:)