oracle和sql server取第一条记录的区别以及rownum详解

我们知道学生可能有重名的情况,那么当重名的时候假设只需要取得重名结果集中的第一条记录。

 

sql server:
select top(1) num,Name from M_Student where name = 'xy'

 

Oracle:
select num,Name from M_Student where name = 'xy' and rownum <= 1

对于rownum在oracle的使用的时候,有几点需要注意:

 

(1) rownum 对于等于某值的查询条件

如果希望找到学生表中第一条学生的信息,可以使用rownum=1作为条件。但是想找到学生表中第二条学生的信息,使用rownum=2结果查不到数据。因为rownum都是从1开始,但是1以上的自然数在rownum做等于判断是时认为都是false条件,所以无法查到rownum = n(n>1的自然数)。

(2) rownum对于大于某值的查询条件

如果想找到从第二行记录以后的记录,当使用rownum>2是查不出记录的,原因是由于rownum是一个总是从1开始的伪列,Oracle 认为rownum> n(n>1的自然数)这种条件依旧不成立,所以查不到记录。

 

(3) rownum对于小于某值的查询条件

rownum对于rownum<n(n>1的自然数)的条件认为是成立的,所以可以找到记录。比如 rownum < 3

(4) rownum和排序

Oracle中的rownum的是在取数据的时候产生的序号,所以想对指定排序的数据去指定的rowmun行数据就必须注意了。

select rownum ,id,name from student order by name;
  
ROWNUM    ID          NAME
3                200003     李三
2                200002     王二
1                200001     张一
4                200004     赵四

可以看出rownum并不是按照name列来生成的序号。系统是按照记录插入时的顺序给记录排的号,rowid也是顺序分配的。必须使用子查询。

 

select rownum ,id,name from (select * from student order by name);

ROWNUM    ID          NAME
3                200003     李三
2                200002     王二
1                200001     张一
4                200004     赵四

这样就成了按name排序,并且用rownum标出正确序号(由小到大)

 
看一个例子

把最先进入公司的5个人找出来

方法一 SELECT * FROM emp WHERE ROWNUM <= 5 ORDER BY hiredate;

方法二 SELECT * FROM(SELECT * FROM emp ORDER BY hiredate) WHERE ROWNUM <= 5;

 

把最先进入公司的6-10个人找出来

方法一
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 10  
MINUS
SELECT * FROM (SELECT * FROM emp ORDER BY hiredate)
WHERE ROWNUM <= 5;

 

方法二(分页常用)
SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT * FROM emp) e WHERE ROWNUM <= 10) t WHERE t.rn >= 6; 

SELECT * FROM (SELECT e.*, ROWNUM rn FROM (SELECT ename, sal FROM emp) e WHERE ROWNUM <= 10) WHERE rn >= 6;

参考博客:

http://topic.csdn.net/t/20040329/17/2900155.html
http://apps.hi.baidu.com/share/detail/5881277

 

时间: 2024-12-31 01:42:30

oracle和sql server取第一条记录的区别以及rownum详解的相关文章

SQL Server 使用触发器(trigger)发送电子邮件步骤详解

sql 使用系统存储过程 sp_send_dbmail 发送电子邮件语法: sp_send_dbmail [ [ @profile_name = ] 'profile_name' ] [ , [ @recipients = ] 'recipients [ ; ...n ]' ] [ , [ @copy_recipients = ] 'copy_recipient [ ; ...n ]' ] [ , [ @blind_copy_recipients = ] 'blind_copy_recipien

SQL Server 2008事务日志传送备份的实施过程详解

熟悉微软企业级数据库软件朋友,了解作为微软一个重大的产品版本,SQL Server 2008除了许多新的特性和关键的改进,使得它成为至今为止的最强大和最全面的SQL Server版本外,其实SQL Server 2008中的备份方式也是其一大亮点,SQL Server 2008使用的备份一个数据库有多种方法,如差异备份和事物日志备份.事务日志备份将复制上次完全或以前的事务日志备份的所有数据变化.事物日志备份通常是非常快并且非常小,仅次于镜像的高可靠性备份方案,可以达到分钟级的灾难恢复能力. 下面

SQL Server 2008 R2数据应用层程序和数据库镜像详解

随着http://www.aliyun.com/zixun/aggregation/11208.html">Microsoft SQL Server 2008 R2即将发布,使得更多的DBA和Visual Studio.Net开发人员更加关注其新增的功能特点.SQL Server 2008 R2提供了主数据服务.数据应用层程序.多服务器管理.Power Pivot for SharePoint .Report Builder 3.0.Stream Insight等众多新功能.在新功能支持下

sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢?

问题描述 sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? sql server的across join语句怎么用?用它怎么取分组结果的第一条记录呢? 解决方案 http://www.2cto.com/database/201509/442742.html 解决方案二: http://zhidao.baidu.com/link?url=zu-YuSRPF-4RKb_yrqC7cZm4Smbz_pWS31ltTFn6HIknGbUHgcOtH8FavG9o

sql server 查找帅选后每个人的第一条记录

问题描述 sql server 查找帅选后每个人的第一条记录 各位师兄 我想建个view 但不知道怎么写sql 麻烦你们指点下 大恩不言谢 字段1 字段2 2 2013-08-01 2 2013-01-01 2 2012-05-01 1 2013-06-26 1 2013-02-01 3 2012-12-12 我要可以根据日期筛选出每个人的第一条数据 比如我输入日期 2013-07-01 结果是 2 2013-01-01 1 2013-06-26 3 2012-12-12 解决方案 如果是有要关

SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)_MsSql

Sqlserver 获取每组中的第一条记录 在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属于不同的方面.功能下面,从数据库的术语来说,就是查找出每组中的一条数据.下面我们要实现的就是在sqlserver中实现从每组中取出第一条数据. 例子 我们要从上面获得的有效数据为: 对应的sql语句如下所示: select * from t1 t where id = (select top 1 id from t1 where grp = t.grp o

SQL获取第一条记录的方法(sqlserver、oracle、mysql数据库)

Sqlserver 获取每组中的第一条记录 在日常生活方面,我们经常需要记录一些操作,类似于日志的操作,最后的记录才是有效数据,而且可能它们属于不同的方面.功能下面,从数据库的术语来说,就是查找出每组中的一条数据.下面我们要实现的就是在sqlserver中实现从每组中取出第一条数据. 例子 我们要从上面获得的有效数据为: 对应的sql语句如下所示: select * from t1 t where id = (select top 1 id from t1 where grp = t.grp o

EXT中如何取grid中的第一条记录

问题描述 如题,表格数据可能会刷新变化,如何才能取得当前的第一条记录的值呢? 解决方案 store.getAt(0) 取得第1个record api中:getAt( Number index ) : Ext.data.RecordGet the Record at the specified index.record都取得了 第1行的信息 很简单了吧record.get("...")建议多看看api解决方案二:你这样写var record=grid.getStore().getAt(0

Oracle与Sql Server差异点详解

1.create函数或存储过程异同点       Oracle 创建函数或存储过程一般是 create or replace --       SQL SERVER 则是在创建之前加一条语句,先判断是否已经存在,如果存在删除已有的函数或存储过程. 函数语句: if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[函数名]') and xtype in (N'FN', N'IF', N'TF')) drop fu