1、select * from News where Ispublished=1 and rownum<=10 order by Publisheddate desc
这样查出来的话是先查出前10条数据再排序,不符合我们的要求。2、select * from (select * from News where Ispublished=1 order by Publisheddate desc) where rownum<=10
这样查出来符合我们的要求,但是它的实现原理是不是把所有的数据查出来,再取出前10条数据.如果是这样的话,当这张表的数据很多的话,它的执行效率会不会很低?有没有什么更好的方法,能保证效率,又能查出前10条数据????帮帮忙~~~~~~

解决方案 »

  1.   

    如果Publisheddate 是索引的话效率应该不会低
      

  2.   

    Publisheddate 不是索引,这样查的话感觉效率会低点,但是如果不这样做的话,有什么办法可以查出前几条数据呢
      

  3.   

    应该用第二种方法来查,因为rownum是一个变化的数
      

  4.   

    如果这样的话,那这是不是Oracle的不可取之处?在SQL server里,还有像 select top 10 * from News 类似的写法。
      

  5.   

    当然,如果用游标的话rownum <=10的条件就不用写了。
      

  6.   

    第一条语句应该是先取出记录满足Ispublished=1里面的10条记录,再进行排序;
    第二条语句时先查询满足Ispublished=1的记录,排序,再取前10条;
    如果一定要对大容量数据进行这样的操作的话,考虑先建个索引!  
      

  7.   

    如果你用的是自动序列可尝试select * from 表名 where 自动编号字段<=n
    select * from news where id<=6
      

  8.   

    那你可以这样写:
    select * from (select a1.*,rownum rn from (select * from emp) a1 where rownum <= 10) where rn >= 1;
    如果要有数据已被删除可以先进行排序再查询
    select * from (select a1.*,rownum rn from (select * from emp order by empno) a1 where rownum <= 10) where rn >= 1;
    这样就不是查询所有记录而再取前10条,可以对次语句进行封装为通用的。