當(dāng)前位置:幫助 >> 高級教程

      ACCESS中如何使得order by rnd(id)真正實現(xiàn)隨機(jī)抽取數(shù)據(jù)庫中記錄

      發(fā)布日期:2020/8/22 11:46:14 訪問次數(shù):6738

      SQL server數(shù)據(jù)庫有個NewID函數(shù),可以很方便的用SQL語句得到數(shù)據(jù)表中的隨機(jī)數(shù)據(jù)。但Access數(shù)據(jù)庫沒這么方便,雖然有個Rnd,可以通過“select top 10 * from tb order by rnd(id)”得到隨機(jī)數(shù)據(jù),VBA環(huán)境下使用沒有問題,可惜在VB中使用,產(chǎn)生的隨機(jī)序列是一樣的,每次調(diào)用返回的數(shù)據(jù)相同。

      有人說在程序中加上Randomize初始化隨機(jī)種子,那么這只說對了一半,在程序中簡單的加上Randomize,是沒作用的,道理很簡單,Randomize不可能影響SQL語句中的Rnd,這個Rnd只不過是個字符串,SQL語句是通過數(shù)據(jù)庫引擎去執(zhí)行的,正因為如此,無法初始化種子,致使每次應(yīng)用產(chǎn)生的隨機(jī)序列是一樣的。

      由此可見,解決問題的關(guān)鍵就是如何初始化隨機(jī)種子。Rnd函數(shù)語法是Rnd(number),它有一個特性,就是如果使用了負(fù)參數(shù)的number,那么就會產(chǎn)生一個固定的隨機(jī)序列。利用這個特性,我們的問題就迎刃而解了,這就是每次調(diào)用Rnd函數(shù)時,使用一個負(fù)的不同的number,從而達(dá)到產(chǎn)生不同隨機(jī)序列的目的。經(jīng)過測試,問題解決。示例代碼如下:        

      '......
      Randomize
      sql = "select top 1 * from tb order by rnd("& Rnd() &"-id)"
      '......

      代碼說明:SQL語句中的Rnd的參數(shù)是一個數(shù)值表達(dá)式,必須包含表中的一個字段(最好是主鍵),因為變量返回的是一個隨機(jī)的0到1之間的single,(一般情況下表中的ID值都是大于1的),從而使參數(shù)的值是個小于0的隨機(jī)數(shù),由此產(chǎn)生了不同的隨機(jī)序列。

      補(bǔ)充一點,有一種提議用time來解決這個問題,就是"select top 10 * from tb order by rnd(" & time & "- id) "。在某些情況下是可以的,但是,如果你需要快速連續(xù)的查詢信息,比如一些搖號程序需要連續(xù)滾動地顯示信息,這種情況下,就會出現(xiàn)連續(xù)幾次返回重復(fù)的信息。究其原因,就是time在做數(shù)值運算的時候,會轉(zhuǎn)換為一個小于1的Double,而rnd返回的是一個Single,顯然,rnd返回的結(jié)果有可能會截去time-id運算后的尾數(shù),在time變化很小的情況下,使rnd返回的值與前次相同,從而返回的查詢結(jié)果相同。
      微信
      QQ
      電話
      13400472755
      返回頂部
      日韩欧洲区精品一区二区,在线视频国内精品呻吟,中日韩人妻人人爽,国产精品久久九九片 a国产a日本八亚洲 日本熟妇牲交视频在线观看,国产在线播放99,国产一级无码视频,国产在线观看添荫蒂视频|www.tjnx.com.cn/ 日本熟妇牲交视频在线观看,国产在线播放99,国产一级无码视频,国产在线观看添荫蒂视频|www.zzshanglu.com http://www.tjnx.com.cn/ http://www.zzshanglu.com