select  rol1,rol2,dt from (select rol1,rol2,sysdate-rol_date dt from tbname order by dt asc) where rownum<10;

解决方案 »

  1.   

    select * 
      from (select x.*, rownum rno
              from mytable x
             order by mydate desc)
     where rno < 11;
      

  2.   

    Using Hint 1. Create Index on that date column
     
      select /*+ INDEX_DESC (T1 INDEX_NAME) */,C1,C2,...
      from T1
      where rownum <= 10
      

  3.   

    select * 
    from table1 
    where rownum < 11 
    order by date desc;
      

  4.   

    在oracle中执行top-n查询:
    一个办法:使用oracle虚列rownum。对于一个查询所返回的每一行,rownum虚列都返回一个数值,这个数表示oracle从一个表或连接行的集合中选择此行的次序。被选择的第一行的rownum为1,第二行为2,依此类推。
    例:返回行数限制为5
    select ......
    from ......
    where rownum < 6;
    还可在之后加上一个order by子句,那么返回的行将根据order by子句重新排序。但得到的结果的次序和在sql_sever中得到的次序是相反的,所以必须先强制排序然后再应用rownum条件,句法如下:
    select empno,ename,job,mgr,hiredate,sal
    from
      (select empno,ename,job,mgr,hiredate,sal
         from emp 
         order by nvl(sal,0) desc)
      where rownum<6;
    二:分析函数:rank()和drank() 区别:如果存在相同值,rank()会在所排的顺序中保留缺位。
    例:select empno,ename,job,mgr,sal,
        rank() over 
         (order by sal desc nulls last)as rank,
        dense_rank() over
         (order by sal desc nulls last)as drank
        from emp
        order by sal desc nulls last;
    要获得一个top-n查询在子查询中使用rank()函数并在子查询外部运用筛选条件:
    select empno,ename,job,mgr,hiredate,sal
      from 
      (select empno,ename,job,mgr,hiredate,sal,
         rank() over
           (order by sal desc nulls last)as emp_rank
         from emp
         order by sal desc nulls last) 
      where emp_rank < 6;
      

  5.   

    在oracle中执行top-n查询:
    一个办法:使用oracle虚列rownum。对于一个查询所返回的每一行,rownum虚列都返回一个数值,这个数表示oracle从一个表或连接行的集合中选择此行的次序。被选择的第一行的rownum为1,第二行为2,依此类推。
    例:返回行数限制为5
    select ......
    from ......
    where rownum < 6;
    还可在之后加上一个order by子句,那么返回的行将根据order by子句重新排序。但得到的结果的次序和在sql_sever中得到的次序是相反的,所以必须先强制排序然后再应用rownum条件,句法如下:
    select empno,ename,job,mgr,hiredate,sal
    from
      (select empno,ename,job,mgr,hiredate,sal
         from emp 
         order by nvl(sal,0) desc)
      where rownum<6;
    二:分析函数:rank()和drank() 区别:如果存在相同值,rank()会在所排的顺序中保留缺位。
    例:select empno,ename,job,mgr,sal,
        rank() over 
         (order by sal desc nulls last)as rank,
        dense_rank() over
         (order by sal desc nulls last)as drank
        from emp
        order by sal desc nulls last;
    要获得一个top-n查询在子查询中使用rank()函数并在子查询外部运用筛选条件:
    select empno,ename,job,mgr,hiredate,sal
      from 
      (select empno,ename,job,mgr,hiredate,sal,
         rank() over
           (order by sal desc nulls last)as emp_rank
         from emp
         order by sal desc nulls last) 
      where emp_rank < 6;
      

  6.   

    用临时工的做法是我比较赞同的,如果在dt字段上加一个索引速度会更快的。
    弱水和zip的做法估计速度会受影响的。
      

  7.   

    select * 
    from table1 
    where rownum < 11 
    order by date desc;
      

  8.   

    bzszp(SongZip)的方法可以得到结果,但是速度太慢。
    black_snail(李刚)的方法似乎更合理,但是执行时找不到INDEX_DESC()函数,不知道是怎么回事。这个问题,以我的感觉,在oracle里没有好的办法,只能通过表结构的设计来解决。
      

  9.   

    dobetter(临时工),mashansj(风影) 的写法是错误的!
    bzszp(SongZip),KingSunSha(弱水三千)是正确地!
    因为语句:select * from table1 where rownum<5 order by now_date desc
    先执行rownum<5即前4条记录,在进行now_date排序!