CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  MS-SQL Server >  基础类

求救:取多条记录中的第一条记录

楼主listen(大力水手--爱吃波菜)2002-01-22 15:03:26 在 MS-SQL Server / 基础类 提问

在查询里查到多条记录,但只想取出这多条记录中的第一条,该如何实现(类似于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

相关问题

  • sql 语句 ,如何取出相同记录中的第一条记录
  • 在Sybase 11中怎么只取出第一条记录
  • 请问如何表示(取得)RecordSet的第一条记录??
  • 怎么取得每个分组中的第一条记录
  • 取一条随机记录
  • 如何取30-40条记录?
  • 怎样在取数据库中值为05的所有记录的第一条记录
  • 记录集(recordset)里,怎么判断记录是不是第一条记录呢
  • 求取某条记录之后的所有记录的方法?
  • 求取某条记录之后的所有记录的方法?

关键词

  • 查询
  • oracle
  • sql
  • rownum
  • 记录
  • sell
  • month
  • field
  • rowid
  • 顺序

得分解答快速导航

  • 帖主:listen
  • backlove

相关链接

  • SQL Server类图书

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo