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);
SET inCache=1
WHERE MESSAGE_ID IN
(SELECT DISTINCT MESSAGE_ID FROM SMSGATEWAY.MessageTablePool
WHERE REGISTERED=0 AND isToLog=0 AND ROWNUM < 99);
我就是要不能忽略order by 才郁闷阿,去掉order by 的话,当然肯定能通过的,希望能提供别的方法。
to Sherwin(Subsky20XX) 兄:
别这么说嘛,我也是接触oracle不久的,不过你的方法好像效率太低了,我打算作为没办法的办法,汗。
即使加了order by ,update 的结果也还是一样的啊.
楼主只要在 SELECT 时,加上ORDER BY不就行了
应该不难实现吧。
在 按message_id排序的结果集 中,取前99个记录。“要修改ROWID小于100的行。只要能查出ROWID为100的行就可以了吗?”
<----这样的话,取到的就是按ROWID排序的前99个记录了
就不用ORCER BY了直接
UPDATE SMSGATEWAY.MessageTablePool
SET inCache=1
WHERE REGISTERED=0 AND isToLog=0 AND ROWNUM < 99
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 );
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;
非常感谢大家,我们公司的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 );
现在结贴给分
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
);
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 );
to Croatia(Croatia)兄:估计你自己也没有试验过把,你这句是不行的,希望你下次帮人前先自己测试一下,^-^。另外不要这么说人家嘛,据说ocp强在oracle管理方面,sql语句可能不是强项把
我只是觉得,他连这么简单的SQL句子都写不出来,实在不可思议。
Rownum是Oracle的一个伪列,利用了ROWID,所以,你第一次使用rownum的时候,他是不会给你按照你的order by排序的,但是后来利用了子查询,你的rowid就不再有用,他会按照你的新的记录集重新排序。这个是很简单的SQL的常识,他都不能明白,所以,我才奇怪的。
我的解释可能不是很确切,建议你,再去看一些,关于rowid,rownum的知识。还有一个就是,你更新的不是100行,只有98行。赫赫。
至于ocp的这个...和那个...,^-^,我不置评论。另外小弟主要是作java的。以前接触的都是mysql和sql server居多,这次是有个项目要从mysql移植到oracle,才这样伤脑筋的:)