先排序還是先取值

2021-04-01 08:57:59 字數 2598 閱讀 6077

題目:ms sqlserveroracle中取出表中按照某欄位排序的前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是先生成...