update (select n.status n_status from a c, c n , b cha 
            where c.status = 1 order by c.prority desc)
            set n_status = upStatus where rownum <= 100;这个sql在oracle9I中是可以执行的但是到了oracle10g中就不能执行了。原因就是order by 和rownum<=100的这个属于不兼容。请教这个语句应该怎么写,才10g中能执行???

解决方案 »


  1. UPDATE (SELECT STATUS
              FROM C
             WHERE ROWID IN (SELECT RID
                               FROM (SELECT C.ROWID RID,
                                            ROW_NUMBER() OVER(ORDER BY C.PRORITY DESC)
                                       FROM A C, C N, B CHA
                                      WHERE C.STATUS = 1)
                              WHERE RN <= 3))
       SET STATUS = UPSTATUS;
      

  2. http://fronkx.blog.hexun.com/17331585_d.html
      

  3. 同oracledbalgtu 观点
    用row_number 换order by 
    然后:
    问题最好能举些实例,这样子好测试!
      

  4. 通过ROW_NUMBER()函数 加OVER开窗函数实现按特定标准排序的行号
      

类似问题 »