Oracle中查詢前10條記錄 ---- Top的變相用法


在Oracle怎樣查詢表中的top10條記錄呢?

  select * from test where rownum <=10     ----說明:rownum只能用於<或<=運算,如果要用>運算符就要用到嵌套查詢。

  下面是關於rownum的介紹:

  Rownum和row_number()、over()的使用

  ROWNUM是Oracle從8開始提供的一個偽列,是把SQL出來的結果進行編號,始終從1開始,常見的用途就是用來分頁輸出.

  比如

  SELECT * FROM torderdetail a WHERE ROWNUM <= 10

  這條語句就是輸出前10條紀錄,在這里用途上類似於sql sever的top,不過rownum對於指定編號區間的輸出應該說更強大

  SELECT *

  FROM (SELECT a.*, ROWNUM rn FROM torderdetail a)

  WHERE rn >= 10 AND rn <= 20

  這條語句即是輸出第10到第20條紀錄,這里之所以用rownum rn,是把rownum轉成實例,因為rownum本身只能用 <=的比較方式,只有轉成實列,這樣就可做 >=的比較了。

  在實際用途中,常常會要求取最近的幾條紀錄,這就需要先對紀錄進行排序,后再取rownum <=某個數值

  一般常見的

  SELECT *

  FROM (SELECT a.* FROM torderdetail a ORDER BY order_date DESC)

  WHERE ROWNUM <= 10

  而在CSDN曾經發生過討論,關於取近的10條紀錄,有人給出這樣的語句

  SELECT a.* FROM torderdetail a

  WHERE ROWNUM <= 10

  ORDER BY order_date DESC

  之所以會出現這樣的語句,主要是從效率上的考慮,前面條語句,是要進行全表掃描后再排序,然后再取10條紀錄,后一條語句則不會全表掃描,只會取出10條紀錄,很明顯后條語句的效率會高許多。

  那為什么會有爭議呢,那就在於在執行順序上爭議,是先排序再取10條紀錄,還是先取10條紀錄再排序呢?兩種順序取出來的結果是截然相反的,先排序再取10條,就是取最近的10條,而先取10條,再排序,則取出的最早的10條紀錄。對於此語句,普遍的認為執行順序是先取10條紀錄再排序的。所以此語句應該是錯誤。但實際上並非如此,此語句的執行順序和order by的字段有關系,如果你order by 的字段是pk,則是先排序,再取10條(速度比第一種語句快),而排序字段不是PK 時,是先取10條再排序,此時結果就與要求不一樣了,所以第二種寫法一定要在排序字段是主鍵的情況下才能保證結果正確。

  Row_number() over()這個分析函數是從9I開始提供的,一般的用途和rownum差不多。

  一般寫法row_number() over( order by order_date desc) 生成的順序和rownum的語句一樣,效率也一樣(對於同樣有order by 的rownum語句來說),所以在這種情況下兩種用法是一樣的。

  而對於分組后取最近的10條紀錄,則是rownum無法實現的,這時只有row_number可以實現,row_number() over(partition by 分組字段 order by 排序字段)就能實現分組后編號,比如說要取近一個月的每天最后10個訂單紀錄

  SELECT *

  FROM (SELECT a.*, ROW_NUMBER () OVER (PARTITION BY TRUNC (order_date) ORDER BY order_date DESC) rn FROM torderdetail a)

  WHERE rn <= 10

  Rownum的另類用法,有時候我們會遇到這種需求,要求輸出當月的所有天數,許多人會煩惱,數據庫里又沒有這樣的表,怎么輸出一個月的所有天數呢?用rownum就能解決:

  SELECT TRUNC (SYSDATE, 'MM') + ROWNUM - 1 FROM DUAL

  CONNECT BY ROWNUM <= TO_NUMBER (TO_CHAR (LAST_DAY (SYSDATE), 'dd'))


原文出自【比特網】,轉載請保留原文鏈接:http://soft.chinabyte.com/database/27/11420027.shtml

=====================================================================================

Oracle 中的Top寫法

由於Oracle不支持select top 語句,所以在Oracle中經常是用order by 跟rownum
的組合來實現select top n的查詢。
簡單地說,實現方法如下所示:
select 列名1 …列名n from
(
select 列名1 …列名n
from 表名 order by 列名1
)
where rownum <=N(抽出記錄數)
order by rownum asc

如:select id,name from (select id,name from student order by name) where rownum<=10 order by rownum asc
按姓名排序取出前十條數據

附:比如取100-150條數據的方法:
(1)最佳選擇:利用分析函數
row_number() over ( partition by col1 order by col2 )
比如想取出100-150條記錄,按照tname排序
select tname,tabtype from (
select tname,tabtype,row_number() over ( order by tname ) rn from tab
) where rn between 100 and 150;

(2)使用rownum 虛列
select tname,tabtype from (
select tname,tabtype,rownum rn from tab where rownum <= 150
) where rn >= 100;

 

 

出處:https://blog.csdn.net/xiaoyiaoyou/article/details/69499625


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM