ITPUB??ì3
12月微软Hyper-V虚拟化沙龙主题征集
ITPUB论坛 » Oracle开发 » 取查询结果的前15条数据是不是可以这样写

标题: [SQL] 取查询结果的前15条数据是不是可以这样写
离线 xipipku
中级会员



精华贴数 0
个人空间 0
技术积分 624 (3104)
社区积分 2 (25265)
注册日期 2004-5-11
论坛徽章:2
授权会员开发板块每日发贴之星    
      

发表于 2008-9-24 11:37 
取查询结果的前15条数据是不是可以这样写

表test有10万条数据,根据其中的col1字段排序取前面15条,col1已经建立索引
select * from test where rownum<16 order by col1 desc;

如果col1没有索引,应该这样写
select * from (select rownum r, col1 from test order by col1) t1 where t1.r<16;

不知道上面说的是否正确?


只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 11:43 
不对
你都应该按照第二种写


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
离线 xilangxiangwa
中级会员


精华贴数 1
个人空间 346
技术积分 1396 (1247)
社区积分 43 (5425)
注册日期 2007-7-26
论坛徽章:8
生肖徽章2007版:马2008北京奥运纪念徽章:赛艇2008北京奥运纪念徽章:花样游泳2008北京奥运纪念徽章:田径2008北京奥运纪念徽章:曲棍球2008北京奥运纪念徽章:乒乓球
生肖徽章2007版:鼠数据库板块每日发贴之星    

发表于 2008-9-24 11:47 
两种写法都不对,答案如下:
select * from (select col1 from test order by col1) t1 where rownum <16;

与是否建立索引无关!

[ 本帖最后由 xilangxiangwa 于 2008-9-24 11:48 编辑 ]


__________________
我愿意我的就是全世界的,有你分享我的快乐,我会更快乐!

个人空间最新报道(2008/11/17):
1、FORM导出到EXCEL_设置EXCEL中字体的颜色(版本二)

欢迎大家来我的个人空间做客!http://space.itpub.net/10595277
只看该作者    顶部
在线/呼叫 dingjun123
djゆoracle


来自 china
精华贴数 3
个人空间 0
技术积分 1915 (912)
社区积分 15 (8980)
注册日期 2006-7-28
论坛徽章:2
2008北京奥运纪念徽章:铁人三项ITPUB新首页上线纪念徽章    
      

发表于 2008-9-24 11:59 
搂上的正确,rownum和order by写一起,那么是rowmun之后再order by,顺序就乱了!


__________________
软件体系架构要以数据库为中心,如oracle,可以充分利用数据库的特性,帮助解决复杂的问题。一个常用的规则是:
如果能用单条sql解决,ok
如果不能用单条sql解决,考虑使用PL/SQL
如果不能用PL/SQL解决,考虑使用java存储过程
如果不能用java解决,那么考虑使用c外部过程
如果c都解决不了,那么考虑一下放弃吧
只看该作者    顶部
离线 kmpx
VICTORY


精华贴数 0
个人空间 0
技术积分 1078 (1713)
社区积分 1 (43006)
注册日期 2006-10-8
论坛徽章:1
2008北京奥运纪念徽章:铁人三项     
      

发表于 2008-9-24 12:02 
JZ没弄明白rownum


__________________
别揣着糊涂装明白
只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 12:05 
三楼的写法比较正规
但楼主的第二种写法结果也一定是正确的,因为rownum列的结果永远是从1开始,查询对这个列的赋值应当是在order by操作之后的。


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
在线/呼叫 zhangfengh
老狐狸


精华贴数 3
个人空间 0
技术积分 14590 (79)
社区积分 7160 (220)
注册日期 2002-10-12
论坛徽章:123
现任管理团队成员生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡生肖徽章2007版:鸡
生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡生肖徽章:鸡

发表于 2008-9-24 12:10 
最好用<=15,养成好习惯


__________________
=======================================
狐狸在这个世界上是凭借聪明而得到生存的,并且在这个世界上占有一席之地,学习狐狸的聪明,少走弯路。
=======================================
吸收别人的经验,使之成为自己的经验!
=======================================
只看该作者    顶部
离线 Laurence.li
玉玄宫


精华贴数 0
个人空间 0
技术积分 7029 (189)
社区积分 419 (1608)
注册日期 2004-8-19
论坛徽章:20
现任管理团队成员ITPUB北京九华山庄2008年会纪念徽章管理团队2007贡献徽章参与2007年甲骨文全球大会(中国上海)纪念ITPUB北京香山2007年会纪念徽章管理团队2006纪念徽章
会员2007贡献徽章会员2006贡献徽章授权会员2008北京奥运纪念徽章:跳水2008北京奥运纪念徽章:篮球2008北京奥运纪念徽章:帆船

发表于 2008-9-24 12:15 
其实楼主是希望提高查询的效率,我提供一种方案供参考:
如果每次查询都是desc排序,就干脆建立desc索引:
create index idx1 on test(col1 desc);
analyze table test estimate statistics for table for all indexes for all indexed columns;
select /*+ index(test idx1) */ col1 from test where rownum < 16;
这样查询出来就是降序排列的前15条了。

如果有时查降序,有时又查升序,那还是建立普通索引:
create index idx2 on test(col1);
analyze ......
查asc前15条:
select /*+ index(test idx2) */ col1 from test where rownum < 16;
查desc前15条:
select /*+ index_desc(test idx2) */ col1 from test where rownum < 16;

以上方法供参考,楼主还须多测试,把数据打乱测试一下,确保正确性后,检验效率,目的其实就是希望不再访问表,而仅仅通过索引取出前15条,当然,你这个col1字段应该是not null的,否则你最好在查询里加上where col1 is not null的查询条件
还有就是,sql的执行和oracle的版本也是有关系的,以上方法曾在9i里用过,问题应该不大,更早的版本就不得而知了,呵呵


__________________
知人者智,自知者明。胜人者有力,自胜者强。知足者富,强行者有志。不失其所者久。死而不亡者寿。
只看该作者    顶部
离线 kmpx
VICTORY


精华贴数 0
个人空间 0
技术积分 1078 (1713)
社区积分 1 (43006)
注册日期 2006-10-8
论坛徽章:1
2008北京奥运纪念徽章:铁人三项     
      

发表于 2008-9-24 12:16 
回复 #6 Laurence.li 的帖子

怎么可能会一样
SQL> with tab as(select 1 col from dual
  2  union all select 2 col from dual
  3  union all select 3 col from dual
  4  union all select 4 col from dual)
  5  select col from (select col,rownum rn from tab order by col desc) where rn<3;

       COL
----------
         2
         1

SQL> with tab as(select 1 col from dual
  2  union all select 2 col from dual
  3  union all select 3 col from dual
  4  union all select 4 col from dual)
  5  select col from (select col,rownum rn from tab order by col desc) where rownum<3;

       COL
----------
         4
         3

SQL>


__________________
别揣着糊涂装明白
只看该作者    顶部
在线/呼叫 dingjun123
djゆoracle


来自 china
精华贴数 3
个人空间 0
技术积分 1915 (912)
社区积分 15 (8980)
注册日期 2006-7-28
论坛徽章:2
2008北京奥运纪念徽章:铁人三项ITPUB新首页上线纪念徽章    
      

发表于 2008-9-24 12:24 


QUOTE:
原帖由 Laurence.li 于 2008-9-24 12:05 发表
三楼的写法比较正规
但楼主的第二种写法结果也一定是正确的,因为rownum列的结果永远是从1开始,查询对这个列的赋值应当是在order by操作之后的。

搂主的两种写法都不对的。但是搂主的第二种写法如果只要求输出前15条,那么是正确的,但是ronum的顺序就乱了,不是自然排序!


__________________
软件体系架构要以数据库为中心,如oracle,可以充分利用数据库的特性,帮助解决复杂的问题。一个常用的规则是:
如果能用单条sql解决,ok
如果不能用单条sql解决,考虑使用PL/SQL
如果不能用PL/SQL解决,考虑使用java存储过程
如果不能用java解决,那么考虑使用c外部过程
如果c都解决不了,那么考虑一下放弃吧
只看该作者    顶部
相关内容


CopyRight 1999-2006 itpub.net All Right Reserved.
北京皓辰广域网络信息技术有限公司. 版权所有
E-mail:Webmaster@itpub.net
京ICP证:010037号 联系我们 法律顾问