天天看點

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);

這樣就成了按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

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;

參考部落格:

<a href="http://topic.csdn.net/t/20040329/17/2900155.html">http://topic.csdn.net/t/20040329/17/2900155.html</a>

<a href="http://apps.hi.baidu.com/share/detail/5881277">http://apps.hi.baidu.com/share/detail/5881277</a>