Oracle中隨機抽取N條記錄


一、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 by NEWID()   
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 BY Rnd(FId)   
SELECT top 10 * FROM tablename ORDER BY Rnd(FId)
FId:為你當前表的ID字段名




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


免責聲明!

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



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