題目:ms sqlserver和oracle中取出表中按照某欄位排序的前n條記錄
這個題目看上去似乎那麼簡單
, 兩種資料庫都提供
order by
子句.
問題應該能夠迎刃而解吧
.先試一下
ms sqlserver
是怎麼做的
:use northwind;
create table testsort (id integer);
insert into testsort values (3);
insert into testsort values (1);
insert into testsort values (4);
insert into testsort values (2);
select * from testsort;
-----------------------------------------
id----------- 31
42
(4 row(s) affected)
假設我們要取出按照
id排序的前三條記錄
:select top 3 * from testsort order by id ;
-----------------------------------------
id----------- 12
3(3 row(s) affected)
很簡單,
一句話就解決了
.再試一下
oracle (
這裡用oracle9i)
sql>create table testsort ( id number);
table created.
sql> insert into testsort values (3);
1 row created.
sql> insert into testsort values (1);
1 row created.
sql> insert into testsort values (4);
1 row created.
sql> insert into testsort values (2);
1 row created.
sql> ***mit;
***mit ***plete.
sql> select * from testsort;
id----------31
42
oracle
沒有ms sqlserver
中取前n
條記錄的
top語法
. 但是有
rownum
可以用來完成類似功能
. sql> select * from testsort where rownum <= 3 order by id;
id----------13
4結果是不是有點出乎意料
? 它並沒有返回所要求的
1 , 2 , 3
的結果. oracle
先根據rownum <=3
的條件限制選取乙個範圍集合
(3,1,4),
然後再在這個集合裡進行排序
. order by
子句是在合適的記錄被取出後才起作用
. 原來如此
, 那麼在
oracle
中如何才能實現這個功能呢
? 通常我們可以採用這種辦法
:sql> select * from (select * from testsort order by id) where rownum <=3;
id----------12
3有點麻煩
,不過也只能這樣
. 相同道理
, 如果想從表中取出按照某欄位排序前m到
n條記錄
下面的oracle
語句是最好的
:sql> select id from
(select id , rownum as con from
(select idfrom testsort order by id
)where rownum <= 3/*n
值*/
)where con >= 2;/*m
值*/
id----------23
ms sqlserver
中也可以用類似的思路解決此類問題
. 當然你也可以用笨一點的辦法
, 比如用前
n條記錄的集合
minus
前m-1
條記錄的集合得到前m
到n
條記錄集合
. (有點象饒口令
) ,
不過ms sqlserver
好象不支援
minus
之類的集合操作
. 看來小小的乙個排序取值問題還真不是那麼簡單呢
!black_snail
先排序還是先取值
先排序還是先取值 題目 mssqlserver和oracle中取出表中按照某欄位排序的前n條記錄 這個題目看上去似乎那麼簡單,兩種都提供orderby子句.問題應該能夠迎刃而解吧.先試一下mssqlserver是怎麼做的 usenorthwind createtabletestsort idinte...
oracle先排序再分頁
oracle排序分頁查詢和mysql資料庫的語句還不一樣,這裡做簡單的記錄。select a.rownum rn from select from v log a order by operatetime desc結果 可以發現,按時間排序了,但是rownum並不是從小到大,因為oracle是先生成...
oracle先排序再分頁
oracle排序分頁查詢和mysql資料庫的語句還不一樣,這裡做簡單的記錄。select a.rownum rn from select from v log a order by operatetime desc結果 可以發現,按時間排序了,但是rownum並不是從小到大,因為oracle是先生成...