select * from (select x.*, rownum rno from mytable x order by mydate desc) where rno < 11;
Using Hint 1. Create Index on that date column
select /*+ INDEX_DESC (T1 INDEX_NAME) */,C1,C2,... from T1 where rownum <= 10
select * from table1 where rownum < 11 order by date desc;
在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;
在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;
dobetter(临时工),mashansj(风影) 的写法是错误的! bzszp(SongZip),KingSunSha(弱水三千)是正确地! 因为语句:select * from table1 where rownum<5 order by now_date desc 先执行rownum<5即前4条记录,在进行now_date排序!
from (select x.*, rownum rno
from mytable x
order by mydate desc)
where rno < 11;
select /*+ INDEX_DESC (T1 INDEX_NAME) */,C1,C2,...
from T1
where rownum <= 10
from table1
where rownum < 11
order by date desc;
一个办法:使用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;
一个办法:使用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;
弱水和zip的做法估计速度会受影响的。
from table1
where rownum < 11
order by date desc;
black_snail(李刚)的方法似乎更合理,但是执行时找不到INDEX_DESC()函数,不知道是怎么回事。这个问题,以我的感觉,在oracle里没有好的办法,只能通过表结构的设计来解决。
bzszp(SongZip),KingSunSha(弱水三千)是正确地!
因为语句:select * from table1 where rownum<5 order by now_date desc
先执行rownum<5即前4条记录,在进行now_date排序!