关于如何生成随机记录
方法一:
在ACCESS環境中用rnd函數解決,以下查詢展示了如何從表中隨機抽取10條記錄
SELECT top 10 * FROM tbl1 ORDER BY Rnd(id)
另外, Rnd(id) 其中的id只是為了提供一個種子,可以利用其他任何數值來完成
id字段是自動編號字段,也可以用其他字段代替,只要能生成數值就行。
如果每次RND得到的結果都一樣,那是因為沒有使用 Randomize 語句來初始化隨機數生成器。
方法二:
在ASP、VB中無法使用上述方法,可以參考使用adodb.recordset.recordcount 屬性以及 adodb.recordset.AbsolutePosition 以及 RND 函數來解決問題。
Function RndID()
??? Dim rs As New ADODB.Recordset
??? Dim strsql As String
??? strsql = "select * from tbl1"
??? rs.CursorLocation = adUseClient
??? rs.Open strsql, CurrentProject.Connection, 2, 3
??? '在Access中可以使用 CurrentProject.Connection,
??? '其他語言中可以用 ADODB.CONNECTION對象。
???
??? Dim i As Long
??? Dim lngCount As Long
??? Dim lngRnd As Long
??? lngCount = rs.RecordCount
??? '一下取前10條隨機記錄
??? For i = 1 To 10
??????? lngRnd = Int((lngCount * Rnd) + 1)
??????? rs.AbsolutePosition = lngRnd
??????? Debug.Print rs("id")
??? Next
End Function
方法三:
用當前 TIME 做種子生成隨機數。如果時間重復最終還是重復,沒有從根本上解決問題,說白了還是種子的問題。要不重復就要徹底解決種子的問題,如果能取得毫秒級時間就基本能解決了
或者建議在組織 SQL 語句的時候有意插入一個 VB 函數生成的隨機值作為種子也可以
Dim sql
Dim RNUM
Randomize
RNUM = Rnd
sql = "select top 1 * from tbl1 order by rnd(" & RNUM & "-id)"
其中,方法三已經經過驗證,可以使用。
附:
關于用 SQL 得到 Access 的隨機記錄集????
此問題早已有人提出,解決的方法也非原創。寫這篇東西,意在共同探討。畢竟目前還沒有非常滿意的結論。先說說現在網上大多數轉貼是這樣說的:
SQL Server 2000:
SELECT TOP n * FROM tanblename ORDER BY NEWID()
Access:
SELECT TOP n * FROM tanblename ORDER BY rnd([一個自動編號字段])
SQL 有了 NEWID() 就無須多講拉,但 Access 中沒有,所以寄望于 RND,實際上這條語句在 Access 中的“查詢”中是可以運行并得到隨機結果的,但在 ASP 中卻無法得到預期的隨機效果——無論如何刷新得到的結果都是一樣的(就算在語句前加上 Randomize 也一樣于事無補)。
當然,也不少其他的解決方法,用數組的,用循環的……不好說不對,但總覺得跑題了。后來有另外的朋友試驗出這個方法:表 TestTable,有自動編號字段 TestID,標題字段 TestTitle,隨機取得5條紀錄,用代碼:
Randomize
SELECT TOP 5 [TestTitle] FROM [TestTable] ORDER BY Rnd(-(TestID+"&Rnd()&"))
實際上,我目前需要應用到隨機紀錄的地方就是用的這條語句,除此我沒有其他更好的方法(但用過才知道,其實這條語句偶然會生成重復紀錄的)。也許你會有更好的方法……
轉載于:https://www.cnblogs.com/cole2295/archive/2009/07/11/1520997.html
總結
以上是生活随笔為你收集整理的关于如何生成随机记录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [轉]子窗口和父窗口的函数或对象能否相互
- 下一篇: 蒙娜丽‌莎瓷砖谁用过吗