在oracle里面,如果有100条记录,排序后取出 第 10 行 到 第 20 行,用什么方法比较好?100分求解

iceyou 2005-01-26 01:45:14
rt
...全文
691 24 打赏 收藏 转发到动态 举报
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
Croatia 2005-02-03
  • 打赏
  • 举报
回复
1。fuxia(mike)的做法看起来比较直观,但是效率比较低,
同时,还会有一个问题。

假如我的这个表的数据,数据全部一样,用minns的结果,你们看看呢?还有几条?

2。njcao(青草)的做法,根本就是不对的,选择不到纪录。根本对rownum就不理解。

3。GerryYang(轻尘) 的做法,是比较好的。
bisliu 2005-02-03
  • 打赏
  • 举报
回复
select tname,tabtype from (
select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;

select tname,tabtype from (
select tname,tabtype,rownum rn from tab
)
where rownum <= 150 and rn >= 100;
相比,效率和结果上会有区别吗?
iceyou 2005-02-02
  • 打赏
  • 举报
回复
非常感谢大家的发言,这是我另外找到的关于这个问题的说法,大家也一起看一下:

oracle 数据分页查询
1. 最好还是利用分析函数
row_number() over ( partition by col1 order by col2 )
比如想取出100-150条记录,按照tname排序
select tname,tabtype from (
   select tname,tabtype,row_number() over ( order by tname ) rn from tab
)
where rn between 100 and 150;
2. 直接使用rownum 虚列
select tname,tabtype from (
   select tname,tabtype,rownum rn from tab where rownum <= 150
)
where rn >= 100;
使用序列不能基于整个记录集合进行排序,如果指定了order by子句,排序的的是选出来的记录集的排序.
------------------------------------------------------------------------
经过我的测试,在100万条数据的表中,检索数据的时候,方法2的速度要比方法1要快的.
sj971059 2005-01-28
  • 打赏
  • 举报
回复
这个问题比较简单.
jiangchuanli 2005-01-28
  • 打赏
  • 举报
回复
公式.可以在SQLPLUS下测试的
select * from
(
select rownum rm,a.* from
(select * from tablename) a
where rownum<=&maxv
)
where rm>=&minv
/
liuyi8903 2005-01-27
  • 打赏
  • 举报
回复
讨论这么多怎么就不见楼主现身?
hippie1024 2005-01-27
  • 打赏
  • 举报
回复
to bisliu 要什么字段可以自己显示的写出来啊,比如B.COL1,B.COL2。我只是个例子么,本来好的SQL习惯就是不应该用select *的,我们这是列入规范的。

to tf(菜鸟) rownum是虚列,看看OTN的描述你就会明白了:

Conditions testing for ROWNUM values greater than a positive integer are always false. For example, this query returns no rows:

SELECT * FROM employees
WHERE ROWNUM > 1;


The first row fetched is assigned a ROWNUM of 1 and makes the condition false. The second row to be fetched is now the first row and is also assigned a ROWNUM of 1 and makes the condition false. All rows subsequently fail to satisfy the condition, so no rows are returned.

cat_cat 2005-01-27
  • 打赏
  • 举报
回复
用minus最简单
tf 2005-01-27
  • 打赏
  • 举报
回复
为什么rownum不能用>啊?
bisliu 2005-01-27
  • 打赏
  • 举报
回复
select b.* from
(SELECT a.*,rownum rn FROM(
SELECT * FROM table order by col1) a
WHERE rownum<=20 )b
where rn>=10
这样写的话,有没有办法去掉多选出来的rownum这列呢?
hippie1024 2005-01-27
  • 打赏
  • 举报
回复
fuxia的minus 需要查两次数据集,再比对,效率比较底
GerryYang的句子没有order by 可以,不过有order by 的话rownum可是在order by之前就排好的哦,这也是我为什么多写的一层查询。
njcao的句子有一个对rownum的常识性错误哦,呵呵,那样是查不到数据的 :)
GerryYang 2005-01-26
  • 打赏
  • 举报
回复
njcao(青草) 不对.
rownum不可以用 ">"
njcao 2005-01-26
  • 打赏
  • 举报
回复
select * from (select * from tab where -- order by --) where rownum>=10 and rownum<=20
就可以了!
baojianjun 2005-01-26
  • 打赏
  • 举报
回复
分頁的話 基礎用rownum可以解決的
GerryYang 2005-01-26
  • 打赏
  • 举报
回复
最简单的应该是
select b.* from
(select a.*,rownum rn from tablename order by col1) b
where b.rn>=10 and b.rn<=20
luxuezhu 2005-01-26
  • 打赏
  • 举报
回复
我总觉得fuxia(mike)的写法要跟直观一点
我也一直用这样的写法
建议初学还是这样写,起码一眼就能够看懂什么意思
yxxx 2005-01-26
  • 打赏
  • 举报
回复
学习
hippie1024 2005-01-26
  • 打赏
  • 举报
回复
呵呵,最原始的写法:
select b.* from
(SELECT a.*,rownum rn FROM(
SELECT * FROM table order by col1) a
WHERE rownum<=20 )b
where rn>=10
fuxia 2005-01-26
  • 打赏
  • 举报
回复
select * from a where rownum<=20
minus
select * from a where rownum<=10
baojianjun 2005-01-26
  • 打赏
  • 举报
回复
使用分析函數中的row_number(),

Oracle 9i 分析函数参考手册

http://www.cnoug.org/viewthread.php?tid=38387
加载更多回复(4)

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧