求救:取多条记录中的第一条记录
在查询里查到多条记录,但只想取出这多条记录中的第一条,该如何实现(类似于ACCESS中的TOP)?当然了,不要求通过游标来实现。 问题点数:20、回复次数:8Top
1 楼net_steven(素狼(W))回复于 2002-01-22 15:23:45 得分 0
最好贴出样表来。类似问题好象出现过许多,请 N_chow(一劍飄香++)们吧。 Top
2 楼listen(大力水手--爱吃波菜)回复于 2002-01-22 15:49:23 得分 0
+--------+---------+-----------+--------------+
|Field_1 | Field_2 | Field_3 | Field_4 |
+--------+---------+-----------+--------------+
| A | 1 | 001 | MM |
+--------+---------+-----------+--------------+
| A | 1 | 002 | QQ |
+--------+---------+-----------+--------------+
| B | 2 | 003 | DD |
+--------+---------+-----------+--------------+
以前两列升序排,以第三列降序排列,然后以排出的顺序,如下:
+--------+---------+-----------+--------------+
|Field_1 | Field_2 | Field_3 | Field_4 |
+--------+---------+-----------+--------------+
| A | 1 | 002 | QQ |
+--------+---------+-----------+--------------+
| A | 1 | 001 | MM |
+--------+---------+-----------+--------------+
| B | 2 | 003 | DD |
+--------+---------+-----------+--------------+
查询出第一条记录,即:
+--------+---------+-----------+--------------+
|Field_1 | Field_2 | Field_3 | Field_4 |
+--------+---------+-----------+--------------+
| A | 1 | 002 | QQ |
+--------+---------+-----------+--------------+
偶知道类似的ACCESS语言来写是:
select top(1) *
from table_name
order by Field_1,Field_2 ASC,Field_3 DESC;
但却不知道在Oracle中如何实现(要求不用游标来做)。
Top
3 楼net_steven(素狼(W))回复于 2002-01-22 16:04:04 得分 0
select rownum, *
from table_name
where rownum=1
order by Field_1,Field_2 ASC,Field_3 DESC
------------------------------------------------
oracle不太熟,大概应该是这样,其中rownum是系统自动产生的伪列,表序号。
Top
4 楼hxflx(踪之声)回复于 2002-01-22 16:08:30 得分 0
select * from table_name where rownum<2 order by Field_1,Field_2 ASC,Field_3 DESC ;
Top
5 楼hxflx(踪之声)回复于 2002-01-22 16:11:48 得分 0
哦?不约而同。差4分钟。Top
6 楼backlove(我愿意)回复于 2002-01-22 16:39:02 得分 20
回复人: net_steven(吃素的狼) (2002-1-22 16:04:05) 得0分
select rownum, *
from table_name
where rownum=1
order by Field_1,Field_2 ASC,Field_3 DESC
------------------------------------------------
oracle不太熟,大概应该是这样,其中rownum是系统自动产生的伪列,表序号。
回复人: hxflx(星星之火) (2002-1-22 16:08:31) 得0分
select * from table_name where rownum<2 order by Field_1,Field_2 ASC,Field_3 DESC ;
都是错的,order by 是不起作用的,取出的顺序是按入库顺序来的,必须用子查询来实现
select * from (select * from table_a order by field_1) where rownum=1
如何正确利用Rownum来限制查询所返回的行数?
软件环境:
1、Windows NT4.0+ORACLE 8.0.4
2、ORACLE安装路径为:C:\ORANT
含义解释:
1、rownum是oracle系统顺序分配为从查询返回的行的编号,返回的第一行分配的是1,第二行是2,
依此类推,这个伪字段可以用于限制查询返回的总行数。
2、rownum不能以任何基表的名称作为前缀。
使用方法:
现有一个商品销售表sale,表结构为:
month char(6) --月份
sell number(10,2) --月销售金额
create table sale (month char(6),sell number);
insert into sale values('200001',1000);
insert into sale values('200002',1100);
insert into sale values('200003',1200);
insert into sale values('200004',1300);
insert into sale values('200005',1400);
insert into sale values('200006',1500);
insert into sale values('200007',1600);
insert into sale values('200101',1100);
insert into sale values('200202',1200);
insert into sale values('200301',1300);
insert into sale values('200008',1000);
commit;
SQL> select rownum,month,sell from sale where rownum=1;(可以用在限制返回记录条数的地方,保证不出错,如:隐式游标)
ROWNUM MONTH SELL
--------- ------ ---------
1 200001 1000
SQL> select rownum,month,sell from sale where rownum=2;(1以上都查不到记录)
没有查到记录
SQL> select rownum,month,sell from sale where rownum>5;
(由于rownum是一个总是从1开始的伪列,Oracle 认为这种条件不成立,查不到记录)
没有查到记录
只返回前3条纪录
SQL> select rownum,month,sell from sale where rownum<4;
ROWNUM MONTH SELL
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
如何用rownum实现大于、小于逻辑?(返回rownum在4—10之间的数据)(minus操作,速度会受影响)
SQL> select rownum,month,sell from sale where rownum<10
2 minus
3 select rownum,month,sell from sale where rownum<5;
ROWNUM MONTH SELL
--------- ------ ---------
5 200005 1400
6 200006 1500
7 200007 1600
8 200101 1100
9 200202 1200
想按日期排序,并且用rownum标出正确序号(有小到大)
SQL> select rownum,month,sell from sale order by month;
ROWNUM MONTH SELL
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
4 200004 1300
5 200005 1400
6 200006 1500
7 200007 1600
11 200008 1000
8 200101 1100
9 200202 1200
10 200301 1300
查询到11记录.
可以发现,rownum并没有实现我们的意图,系统是按照记录入库时的顺序给记录排的号,rowid也是顺序分配的
SQL> select rowid,rownum,month,sell from sale order by rowid;
ROWID ROWNUM MONTH SELL
------------------ --------- ------ ---------
000000E4.0000.0002 1 200001 1000
000000E4.0001.0002 2 200002 1100
000000E4.0002.0002 3 200003 1200
000000E4.0003.0002 4 200004 1300
000000E4.0004.0002 5 200005 1400
000000E4.0005.0002 6 200006 1500
000000E4.0006.0002 7 200007 1600
000000E4.0007.0002 8 200101 1100
000000E4.0008.0002 9 200202 1200
000000E4.0009.0002 10 200301 1300
000000E4.000A.0002 11 200008 1000
查询到11记录.
正确用法,使用子查询
SQL> select rownum,month,sell from (select month,sell from sale group by month,sell) where rownum<13;
ROWNUM MONTH SELL
--------- ------ ---------
1 200001 1000
2 200002 1100
3 200003 1200
4 200004 1300
5 200005 1400
6 200006 1500
7 200007 1600
8 200008 1000
9 200101 1100
10 200202 1200
11 200301 1300
按销售金额排序,并且用rownum标出正确序号(有小到大)
SQL> select rownum,month,sell from (select sell,month from sale group by sell,month) where rownum<13;
ROWNUM MONTH SELL
--------- ------ ---------
1 200001 1000
2 200008 1000
3 200002 1100
4 200101 1100
5 200003 1200
6 200202 1200
7 200004 1300
8 200301 1300
9 200005 1400
10 200006 1500
11 200007 1600
查询到11记录.
利用以上方法,如在打印报表时,想在查出的数据中自动加上行号,就可以利用rownum。
返回第5—9条纪录,按月份排序
SQL> select * from (select rownum row_id ,month,sell
2 from (select month,sell from sale group by month,sell))
3 where row_id between 5 and 9;
ROW_ID MONTH SELL
---------- ------ ----------
5 200005 1400
6 200006 1500
7 200007 1600
8 200008 1000
9 200101 1100
阿木伯
转载请注明出处,谢谢 Oracle技术网http://www.oradb.net/
Top
7 楼listen(大力水手--爱吃波菜)回复于 2002-01-22 16:48:15 得分 0
hxflx(星星之火):多谢,你可真是了解偶的想法呀,我要得就是你所说的那种结果,偶要多多的给你分!!Top
8 楼listen(大力水手--爱吃波菜)回复于 2002-01-23 10:33:27 得分 0
backlove(我愿意) :为什么有时候说order by 的位置上有错?Top




