先排序還是先取值

2021-06-16 01:05:18 字數 1686 閱讀 4158

先排序還是先取值

題目: mssqlserver和oracle中取出表中按照某欄位排序的前n條記錄

這個題目看上去似乎那麼簡單,兩種都提供orderby子句.問題應該能夠迎刃而解吧.

先試一下mssqlserver是怎麼做的:

usenorthwind;

createtabletestsort(idinteger);

insertintotestsortvalues(3);

insertintotestsortvalues(1);

insertintotestsortvalues(4);

insertintotestsortvalues(2);

select*fromtestsort;    

-----------------------------------------

id         

-----------31

42(4row(s)affected)

假設我們要取出按照id排序的前三條記錄:

selecttop3*fromtestsortorderbyid;       

-----------------------------------------

id         

-----------12

3(3row(s)affected) 

很簡單,一句話就解決了.

再試一下oracle(這裡用oracle9i)

sql> createtabletestsort(idnumber);

tablecreated.

sql>insertintotestsortvalues(3);

1rowcreated.

sql>insertintotestsortvalues(1);

1rowcreated.

sql>insertintotestsortvalues(4);

1rowcreated.

sql>insertintotestsortvalues(2);

1rowcreated.

sql>commit;

commitcomplete.

sql>select*fromtestsort;

id----------31

42oracle沒有mssqlserver中取前n條記錄的top語法.但是有rownum可以用來完成類似功能.

sql>select*fromtestsortwhererownum<=3orderbyid;

id----------13

4結果是不是有點出乎意料?它並沒有返回所要求的1,2,3的結果.oracle先根據rownum<=3的條件限制選取乙個範圍集合(3,1,4),然後再在這個集合裡進行排序.

orderby子句是在合適的記錄被取出後才起作用.

原來如此,那麼在oracle中如何才能實現這個功能呢?

通常我們可以採用這種辦法:

sql>select*from(select*fromtestsortorderbyid)whererownum<=3;

id----------12

3有點麻煩,不過也只能這樣.

相同道理,如果想從表中取出按照某欄位排序前m到n條記錄

下面的oracle語句是最好的:

sql>selectidfrom

(selectid,rownumasconfrom

先排序還是先取值

題目 ms sqlserver和oracle中取出表中按照某欄位排序的前n條記錄 這個題目看上去似乎那麼簡單 兩種資料庫都提供 order by 子句.問題應該能夠迎刃而解吧 先試一下 ms sqlserver 是怎麼做的 use northwind create table testsort id...

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是先生成...