先排序還是先取值
題目: 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是先生成...