随机提取access数据库记录的几种方法
前天有人在QQ群里问如何从Access数据库里随机抽取几条记录。这个问题如果放在SQL Server上就比较容易解决,比如随机抽取10条记录,采用的T-SQL语句是:
Select Top 10 * From [SomeTable] Order By NewID()
可以获得很好的效果,但是对于Access数据库而言就没有这么方便了。
在以前我也遇到过这样的问题,当时写一篇整理文字来讨论这个问题。这两天找到了这篇文字重新整理一下放在这里。 采用的Access数据库。总结了几种办法
方法一:有人用如下代码以记录总数为极大值来首先提取出指定数量的随机数,然后以这些随机数做为记录ID。
VBScript代码:
dim n,j
dim su()
dim a,b,k
b=myrs.RecordCount
Randomize
redim su(index_N)
su(1)=Int((b * Rnd) + 1)
for n=2 to index_N
a=Int((b * Rnd) + 1)
for j=1 to n
do while a=su(j)
a=Int((b* Rnd) + 1)
j=1
loop
next
su(n)=a
next
这种方式有一些问题,就是当主键ID不连续的话,有可能某些随机数不存在ID序列当中。另外ID的最大值与总的记录值不一定相等,这样有些记录ID会永远被忽略。
方法二:有人采用一条SQL语句解决此问题
select top 5 * From Table1 order by Rnd()*5
这条语句可以随机从Access数据库中摄取5条记录。但是实际操作中,其生成的记录结果是固定的,失去了随机摄取记录的意义。
方法三:有这样一种方法。
利用随机数生成主键的记录ID
yourstr="*1*3*4*6*12*...."
然后用
sql="select top 10 * form yourdb where instr('*'&id&'*','"&yourstr&"')<>0"
yourstr
可以生成随机数多一点大于所限定抽取的随机数为好。这样可以排除记录不足的情况。
此方法也不太好,而且采用InStr语句,不能利用索引优化,对资源有一定的消耗。
方法四:
代码实现如下:
<%
n=10 ''取任意10条记录
set rs = server.CreateObject ("adodb.recordset")
sql = "select * from table"
rs.open sql,conn,1,1
count=rs.recordcount ''记录总数
IF Count<>empty Then
Randomize
for i = 1 to n ''循环n次
num=Fix(Rnd*count) ''num便是随机产生的记录行数,用Fix(),使其不会大于count值。
rs.move num ''移到改随机行
Response.write rs(0) ''出该条记录
rs.movefirst ''别忘了再把指针移到第一条
next
End IF
rs.close
set rs = nothing
%>
这个方式感觉上比较好些。
方法五:
此方法应该算是比较接近于SQL Server的用法了。
代码:
randomize '得到随机的种子,9999根据你的记录数量级调整,具体调到你出来的记录集随机序列均化
seed=round(rnd*9999)
'以下两种方法都可以,id是主键自增字段
Sql="select id,分值 from table where order by rnd(-"&seed&"-id-"&seed&")"
……
如果还有更好的方法也可以提出来。
做一个数据关联,就像SQL一样,还有种方法就是有做一个界面,例如用VB做,把不同的TEXT连接到不同表,显示出来的效果完全可以达到你的要求。最简单的还是做数据关联。
Select Top 8 * From table order by Rnd(numb),numb是数字型的,一般是序号。得到的记录是随机的,每次都不一样,这个很适用于做考试系统,从题库里选题