在ms sqlserver中,取满足条件的前几行可以使用select top语句,但在oracle中并没有这样的语句,
我从网上看到了一种实现select * (select * from talbename) where rownum <=100 order by rownum asc这样的确可以实现与select top 相同的效果
不过我想请问,这条语句是先查找出所有结果,然后再返回前100行?
还是查找到符合条件的100行记录就停止查找?

解决方案 »

  1.   

    order by asc...画蛇添足了吧。子查询里面要加上排序
    当然要检索所有的结果,否则怎么知道那100条记录就是符合条件的
      

  2.   

    嗯,外面的orderby 似乎是没用, 我实际使用的时候用的是下面的语句
    select * (select * from talbename order by UUID) where rownum <=100 实际上我是想在分页上使用,每页查100条,用户按下一页时候再查100条,而不是一次全查出来
    按照1楼说的,似乎这条语句达不到我想要的效果啊
      

  3.   

    select * from 
      (select a.*,row_number()over(order by uuid)rn from tablename a)
    where rn>=beginnum and rn<=endnum
    order by rn
      

  4.   

    说实话,没看懂
    不过我查了下 rownum的解释,这是个伪列,标明当前记录是查询到的第几条,
    如果这样的话,
    select * from table where rumber <= 100 就可以查询出前100条
    然后我可以记录下当前第100条的记录的中的ID,以后每一页,只要
    select * from table where rumber <= 100 and ID>LastID 
    这样就可以满足我的需求了
    这样的话 ,我实在没有看出嵌套select 有什么作用
      

  5.   

    如果你愿意每翻一页都记录一次lastid,那是没必要嵌套子查询
    那么如果你直接翻到第四页呢,还没来得及记录上第三页的lastid,怎么办?
      

  6.   

    只保留上页下页..
    用子查询确实会降低性能,用不到索引
    如果那些记录不是经常变化,或者改动不用改变原有的排列顺序。可以考虑加个rn字段,赋予你要的rownum值,建索引,这样的话就可以用。只是好像不太可能..
    select * from table where rumber <= 100 and rn>100*(页码-1)
      

  7.   

    不行的.rumber 在你ORDER BY之前就已经定好的了.所以才要嵌套子查询.
      

  8.   

    select * (select * from talbename) where rownum <=100 order by rownum asc 修改为:select * from (select * from talbename order by rownum asc ) a where rownum <=100 
      

  9.   

    写个子查询用row_number()over(order by )函数解决
      

  10.   


    小于不需要rownum做order by了。
      

  11.   


    呵呵,不过大于也不要。不好解决的是有order by的分页。比如select * from table_a order by field1 这样的方式好像必须嵌套一下才行哟,这里有没有好的处理方法呀。
      

  12.   

    多谢大家,看了大家的回复,我又在网上查了查资料,得出如下结论
    rownum 和 row_number()over(order by..) 的不同之一在于 :rownum 是先按照where查询,并添加伪列rownum ,然后order by
    而 row_number()over(order by..) 则会在排序之后才插入rownum
    这个结论我做实验已经证实而不使用runnum 时,嵌套的必要就出现了
    select table_a.*,row_number()over(order by ID)rn from table_a where rn <=10;
    这个语句是错误的,因为 在where 时候 “rn”没有产生