如何从一张ORACLE表中用一条语句将数据排序并取出前10行?

皮皮堵儿 2001-03-07 09:52:00
...全文
12661 42 打赏 收藏 转发到动态 举报
写回复
用AI写文章
42 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyizq0260 2001-03-21
  • 打赏
  • 举报
回复
大家的思路好像都集中在ORDERBY 和ROWNUM上,如果你开发过ORACLE的FORM,就会很快得到答案。使用游标或者称为事务,可很好解决这个问题:
declare
i integer;
 rec record like.表....(不确,查相关资料)
cursor cur_dd is
select * FROM 表 ORDER BY 列 DESC
Begin
i:=0;
  open cur_dd;
  loop
 fetch cur_dd into rec
i:=i+1;
exit when i>10
显示该条记录
end loop;
yiyizq0260 2001-03-21
  • 打赏
  • 举报
回复
大家的思路好像都集中在ORDERBY 和ROWNUM
strikeeagle 2001-03-20
  • 打赏
  • 举报
回复
你可以这样做嘛,先排序,再取前5条
select * from (select * from abcd order by a) where rownum<=5;
yiwei 2001-03-12
  • 打赏
  • 举报
回复
呵呵,不好意思不好意思,我错了我错了,呵呵,还望大家见谅!!!

:)
haihong 2001-03-12
  • 打赏
  • 举报
回复
To yiwei(垃圾)等:
select rownum, aa,bb,cc from test where rownum <=5 order by aa;
这种是把前5条排序
人家是要所有的排序,再取前5条
starkbl 2001-03-10
  • 打赏
  • 举报
回复
select -1*t1 from ( select -1*t1 from ttt group by t1 ) where rownum < 5
”-1*t1“ 怎么用啊?
starkbl 2001-03-10
  • 打赏
  • 举报
回复
rownum 好像是按物理序排列的,有order by 时是先生成rownum的
可以建临时表完成
只查询欲查询表中的主键,建立temporary表,然后再用rownum取出前十条
这样效率不会很低的
格利高里 2001-03-10
  • 打赏
  • 举报
回复

To yiwei(垃圾):
你做试验用的记录集,选得实在是不合适,随便选就成么?而且不听... 这样做程序,才是 --
I 服 了 U
看看下面的记录:oracle8.0.5、Win2000 server。
AA列有索引, BB、CC列 没有索引。

SQL> desc test;
Name Null? Type
------------------------------- -------- ----
AA VARCHAR2(10)
BB VARCHAR2(10)
CC NUMBER

SQL> select * from test;

AA BB CC
---------- ---------- ---------
12 01 1
13 02 1
1201 03 0
14 04 0
1302 05 1
101 022 -1
121 02 0
142 03 1

8 rows selected.

SQL> select rownum, aa,bb,cc from test where rownum <=5 order by aa;

ROWNUM AA BB CC
--------- ---------- ---------- ---------
1 12 01 1
3 1201 03 0
2 13 02 1
5 1302 05 1
4 14 04 0

SQL> select rownum, aa,bb,cc from test where rownum <=5 order by aa desc;

ROWNUM AA BB CC
--------- ---------- ---------- ---------
4 14 04 0
5 1302 05 1
2 13 02 1
3 1201 03 0
1 12 01 1

SQL> select rownum, aa,bb,cc from test where rownum <=5 order by bb;

ROWNUM AA BB CC
--------- ---------- ---------- ---------
1 12 01 1
2 13 02 1
3 1201 03 0
4 14 04 0
5 1302 05 1

SQL> select rownum, aa,bb,cc from test where rownum <=5 order by bb desc;

ROWNUM AA BB CC
--------- ---------- ---------- ---------
5 1302 05 1
4 14 04 0
3 1201 03 0
2 13 02 1
1 12 01 1

SQL> select aa,bb,cc from test where rownum <=5 order by bb desc;

AA BB CC
---------- ---------- ---------
1302 05 1
14 04 0
1201 03 0
13 02 1
12 01 1

结果很显然,rownum比order by 出现的早,大家还是想别的办法吧。
结果很显然,rownum比order by 出现的早,大家还是想别的办法吧。







 

feng_zi 2001-03-10
  • 打赏
  • 举报
回复
select * from tablename where rownum<=10 order by columnname;
select * from tablename where rownum<=10 order by columnname desc;

在8.0里都可以实现,难道在8.1里不可吗?我在ORACLE过程中,只发现了,在8.1中能用,但在8.0中不能,却没有发现过在8.0中能用,在8.1中不能用的句。
格利高里 2001-03-09
  • 打赏
  • 举报
回复

to hcduguo: http://www.csdn.net/expert/Topic/80398.shtm 也是关于这个问题的吧。
Oracle的rownum 与 order by 是有问题??
如果确实不行的话,还是建立一个排序后的标示字段,根据这个标识字段的取值范围来确定读取记录。


yiwei 2001-03-09
  • 打赏
  • 举报
回复
嘿嘿,仔细看了看那段E文,ORACLE没有说不能用。大家仔细看看吧,那段文字的大意是这样的:
“Oracle 分配一个ROWNUM给每一行被检索出来的数据,在行被一个ORDER BY 子句排序之前,因此一个ORDER BY 子句通常不会影响每一行的ROWNUM。然而,如果一个ORDER BY 子句促使Oracle使用一个索引去访问数据,Oracle可能用一种不同于没有索引的顺序来检索那些行,因此那些ROWNUM可能不同于没有使用ORDER BY 子句时的情况。”
真是一点都没有错,看看我的那些试验结果吧。:)
yiwei 2001-03-09
  • 打赏
  • 举报
回复
倒,I服了U,什么叫我试出来?事实就是这样,能用!我在我的数据库里每个表都试验了,所有的表都可以,其中只有几个是我建的,那些表有没有索引、关键字这些我都不知道。
seashoreking 2001-03-09
  • 打赏
  • 举报
回复
select * from table WHERE ROWNUM<=10 order by columnname
mycode 2001-03-09
  • 打赏
  • 举报
回复
Oracle不保证能用,就算你试出来,又有人敢用到关键应用,如股票交易这样的系统上吗?
别争了.
yiwei 2001-03-09
  • 打赏
  • 举报
回复
这个又怎么样????我都是实践出来的,并不是张口乱说

SQL> select rownum,jiudianname as 酒店名称,doubleroom as 双人间数量, xinji as 星级, address as 地址,
telephone as 电话 from tab_jiudian where rownum<=10 order by xinji desc,doubleroom desc;

ROWNUM 酒店名称 双人间数量 星级
--------- ------------------------------------------ -------------------- ----------
地址 电话
------------------------------------------------------------ ------------------------------
2 丽晶大酒店 1145 5
山东省青岛市台湾路1号 (0532)5881818

3 青岛汇泉王朝大酒店 970 4
山东省青岛市南海路9号 (0632)2873366

4 青岛东方饭店 800-900 4
山东省青岛市市南区大学路4号 (0532)2865888

9 黄山云谷山庄宾馆 580 3
安徽省黄山风景区云谷寺 (0559)5562477

1 济南明湖大酒店 468 3
山东省济南市北园大街398号 (0531)5956688

6 安徽安港大酒店 400-450 3
安徽省合肥市芜湖路273号 (0551)2626888

5 烟台国贸大酒店 400 3

ROWNUM 酒店名称 双人间数量 星级
--------- ------------------------------------------ -------------------- ----------
地址 电话
------------------------------------------------------------ ------------------------------
山东省烟台市南大街303号 (0535)6217888

10 黄山太平国际大酒店 320 3
安徽省黄山市黄山区平湖路17号 (0559)8532888

7 华侨饭店 220-460 3
安徽省合肥市长江路98号 (0511)2652221

8 华宾馆 120-160 1
安徽省马鞍山市湖东中路华冶院内 (0555)2345485


查询到10记录.

SQL>
yiwei 2001-03-09
  • 打赏
  • 举报
回复
不是,是USELINENO没有索引


SQL> select rownum,logid,starttime,callednumber,uselineno from calllog where rownum<=10 order by cal
lednumber desc;

ROWNUM LOGID STARTTIME CALLEDNUMBER USELINENO
--------- --------- ---------- ------------------------- ---------
7 71087 01-1月 -01 951289 6
6 71086 01-1月 -01 951288 5
5 71085 01-1月 -01 951287 4
4 71084 01-1月 -01 951286 3
3 71083 01-1月 -01 951285 2
2 71082 01-1月 -01 951284 1
1 71081 01-1月 -01 951283 0
10 71090 01-1月 -01 9512812 9
9 71089 01-1月 -01 9512811 8
8 71088 01-1月 -01 9512810 7

查询到10记录.

SQL>

这个也没有索引
yiwei 2001-03-09
  • 打赏
  • 举报
回复
SQL> select rownum,logid,starttime,callingnumber,uselineno from calllog where rownum<=10 order by us
elineno desc;

ROWNUM LOGID STARTTIME CALLINGNUMBER USELINENO
--------- --------- ---------- ------------------------- ---------
10 71090 01-1月 -01 098888888 9
9 71089 01-1月 -01 088888888 8
8 71088 01-1月 -01 078888888 7
7 71093 01-1月 -01 068888888 6
6 71086 01-1月 -01 058888888 5
5 71085 01-1月 -01 048888888 4
4 71087 01-1月 -01 038888888 3
3 71083 01-1月 -01 028888888 2
2 71082 01-1月 -01 018888888 1
1 71081 01-1月 -01 008888888 0

查询到10记录.

SQL>
更特殊的,这里areacode没有索引。

我还能说什么?事实摆在眼前
haihong 2001-03-09
  • 打赏
  • 举报
回复
倒序也好办呀
select -1*t1 from ( select -1*t1 from ttt group by t1 ) where rownum < 5
呵呵
yiwei 2001-03-09
  • 打赏
  • 举报
回复
OK,叫我试,我就试,事实就是事实,说什么都没有用。

SQL*Plus: Release 8.0.4.0.0 - Production on 星期五 3月 9 20:45:57 2001

(c) Copyright 1997 Oracle Corporation. All rights reserved.


连接到:
Oracle8i Enterprise Edition Release 8.1.6.1.0 - Production
With the Partitioning option
JServer Release 8.1.6.0.0 - Production

SQL> select rownum,logid,starttime,callingnumber from calllog where rownum<=20 order by callingnumbe
r desc;

ROWNUM LOGID STARTTIME CALLINGNUMBER
--------- --------- ---------- -------------------------
10 71090 01-1月 -01 098888888
9 71089 01-1月 -01 088888888
8 71088 01-1月 -01 078888888
7 71087 01-1月 -01 068888888
6 71086 01-1月 -01 058888888
5 71085 01-1月 -01 048888888
4 71084 01-1月 -01 038888888
3 71083 01-1月 -01 028888888
20 71100 01-1月 -01 0198888888
19 71099 01-1月 -01 0188888888
2 71082 01-1月 -01 018888888
18 71098 01-1月 -01 0178888888
17 71097 01-1月 -01 0168888888
16 71096 01-1月 -01 0158888888
15 71095 01-1月 -01 0148888888
14 71094 01-1月 -01 0138888888
13 71093 01-1月 -01 0128888888
12 71092 01-1月 -01 0118888888
11 71091 01-1月 -01 0108888888
1 71081 01-1月 -01 008888888

查询到20记录.

SQL>
woodpan 2001-03-09
  • 打赏
  • 举报
回复
好啦好啦,诸位,这个问题早就该结了。liguangyi贴的那段e文已经说的很明白了。haihong的想法倒是很有创意,可惜没什么实用价值。
to:tangtao
我的意思是不限制取出条数,排序就随你怎么排了哇。
加载更多回复(22)

34,593

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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