Oracle中隨機抽取N條記錄

來源:互聯網
上載者:User

標籤:

一、Oracle取隨機資料 
1Oracle訪問資料的基本方法: 
1)、全表掃描(Full table Scan):執行全表掃描,Oracle讀表中的所有記錄,考查每一行是否滿足WHERE條件。Oracle順序的讀分配給該表的每一個資料區塊,且每個資料區塊Oracle唯讀一次.這樣全表掃描能夠受益於多塊讀. 
  
2)、採樣表掃描(sample table scan):掃描返回表中隨機採樣資料,這種訪問方式需要在FROM語句中包含SAMPLE選項或者SAMPLE BLOCK選項. 
  
註:從Oracle8i開始Oracle提供採樣表掃描特性 

  
2、使用sample獲得隨機結果集 
2.1、文法:SAMPLE [ BLOCK ](sample_percent)[ SEED(seed_value)]  
SAMPLE選項:表示按行採樣來執行一個全表掃描,Oracle從表中讀取特定百分比的記錄,並判斷是否滿足WHERE子句以返回結果。 
BLOCK:表示使用隨機塊例舉而不是隨機行例舉。 
sample_percent:是隨機擷取一張表中記錄的百分比。比如值為10,那就是表中的隨機的百分之10的記錄。 
              值必須大於等於.000001,小於100。 
SEED:表示從哪條記錄返回,類似於預先設定例舉結果,因而每次返回的結果都是固定的。該值必須介於0和4294967295之間。 
  
2.2、舉例說明 
   建立測試暫存資料表: 

 

Sql代碼  

1. SQL> select dbms_random.value() from dual;  

2.    

3. DBMS_RANDOM.VALUE()  

4. -------------------  

5.   0.146123095968043  

6.    

7. SQL> select dbms_random.value() from dual;  

8.    

9. DBMS_RANDOM.VALUE()  

10.-------------------  

11.   0.90175764902345  

 

Sql代碼  

1. SQL> select dbms_random.value(1,10) from dual;  

2.    

3. DBMS_RANDOM.VALUE(1,10)  

4. -----------------------  

5.        9.86601968210438  

6.    

7. SQL> select dbms_random.value(1,10) from dual;  

8.    

9. DBMS_RANDOM.VALUE(1,10)  

10.-----------------------  

11.       3.43475105499398  

 

 3.2、舉例說明

  

Sql代碼  

1. SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;  

2.    

3. OBJECT_NAME  

4. --------------------------------------------------------------------------------  

5. /6dd0fe0e_CertificateCertifica  

6. /cf5224d7_SunJSSE_a4  

7. KU$_PARSED_ITEMS  

8. javax/swing/text/IconView  

9. oracle/xml/jdwp/XSLJDWPString  

10.   

11.SQL> select * from (select object_name from zeeno order by dbms_random.random) where rownum<6;  

12.   

13.OBJECT_NAME  

14.--------------------------------------------------------------------------------  

15.java/io/ObjectOutputStream$1  

16.sun/security/krb5/KrbAsReq  

17./2d52a21c_Last  

18.SYS_YOID0000006594$  

19./308fbfa1_BeanContextServices  

 

Sql代碼  

1. SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;  

2.    

3. OBJECT_NAME  

4. --------------------------------------------------------------------------------  

5. ICOL$  

6. C_COBJ#  

7. PROXY_ROLE_DATA$  

8. I_OBJ#  

9. UET$  

10.   

11.SQL> select * from (select object_name from zeeno order by trunc(dbms_random.value(1,3))) where rownum<6;  

12.   

13.OBJECT_NAME  

14.--------------------------------------------------------------------------------  

15.ICOL$  

16.UNDO$  

17.I_PROXY_ROLE_DATA$_1  

18.I_CDEF2  

19.UET$  

 

Sql代碼  

1. SQL> select trunc(dbms_random.value(0, 1000)) randomNum from dual; --(0-1000的整數)  

2.    

3.  RANDOMNUM  

4. ----------  

5.        790  

6.    

7. SQL> select dbms_random.value(0, 1000) randomNum from dual; --(0-1000的浮點數)  

8.    

9.  RANDOMNUM  

10.----------  

11.997.876726  

 

4、使用內建函式sys_guid()  

Sql代碼  

1. SQL>  select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;   

2.    

3. OBJECT_NAME  

4. --------------------------------------------------------------------------------  

5. /6bedadd5_KeyManagerFactory1  

6. /ffd795c8_AddCRIF  

7. TABLE_EXPORT_OBJECTS  

8. /278cd3a4_CGParselet  

9. KU$_REFCOL_T  

10.   

11.SQL>  select * from (select OBJECT_NAME from zeeno order by sys_guid()) where rownum < 6;  

12.   

13.OBJECT_NAME  

14.--------------------------------------------------------------------------------  

15.sun/awt/InputMethodSupport  

16.V_$RESTORE_POINT  

17.COLORSLIST  

18.java/util/WeakHashMap$Entry  

19.DBMSOUTPUT_LINESARRAY  

 

:

      在使用sys_guid() 這種方法時,有時會擷取到相同的記錄,即和前一次查詢的結果集是一樣的,尋找相關資料,有些說是和作業系統有關,在windows平台下正常,擷取到的資料是隨機的,而在linux等平台下始終是相同不變的資料集,有些說是因為sys_guid()函數本身的問題,即sys_guid()會在查詢上產生一個16位元組的通用唯一識別碼,這個標識符在絕大部分平台上由一個宿主標識符和進程或進程的線程標識符組成,這就是說,它很可能是隨機的,但是並不表示一定是百分之百的這樣。
      
       所以,為確保在不同的平台每次讀取的資料都是隨機的,我們大多採用使用sample函數或者DBMS_RANDOM包獲得隨機結果集,其中使用sample函數更常用,因為其查詢時縮小了查詢範圍,在查詢大表,且要提取資料不是很不多的情況下,會對查詢速度上有明顯的提高。


 

二、其他資料庫隨機取出n條記錄:

1SqlServer中隨機提取資料庫記錄

select top n * from 表 order by newid()

--------------------------------------------------------------------------------
select top 10 * from tablename order byNEWID()   
select top 10 * from tablename order by NEWID()

2mysql中隨機提取資料庫記錄

Select * From 表 order By rand() Limit n

-------------------------------------------------------------------------------
select * from tablename order by rand() limit 10
select * from tablename order by rand() limit 10

3Access中隨機提取資料庫記錄

Select top n * FROM 表 orDER BY Rnd(id)

-------------------------------------------------------------------------------
SELECT top 10 * FROM tablename ORDER BYRnd(FId)   
SELECT top 10 * FROM tablename ORDER BY Rnd(FId)
FId:為你當前表的ID欄位名




轉載源 http://kb.cnblogs.com/a/1443619/
轉載源  http://hpitcn.iteye.com/blog/676330

Oracle中隨機抽取N條記錄

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.