我用VC在ACCESS里随即抽取10条记录 select top 10*from table order by rnd(ID); 但是每次都是一样的10条

如题所述

Access数据库可以通过“select top 10 * from tb order by rnd(id)”得到随机数据,VBA环境下使用没有问题,可惜在VB中使用,产生的随机序列是一样的,每次调用返回的数据相同。
有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单,Randomize不可能影响SQL语句中的Rnd,这个Rnd只不过是个字符串,SQL语句是通过数据库引擎去执行的,正因为如此,无法初始化种子,致使每次应用产生的随机序列是一样的。
由此可见,解决问题的关键就是如何初始化随机种子。Rnd函数语法是Rnd(number),它有一个特性,就是如果使用了负参数的number,那么就会产生一个固定的随机序列。利用这个特性,我们的问题就迎刃而解了,这就是每次调用Rnd函数时,使用一个负的不同的number,从而达到产生不同随机序列的目的。经过测试,问题解决。示例代码如下:
’......
Dim sql As String
Dim r As Single
Randomize
r = Rnd
sql = "select top 1 * from tb order by rnd(" & r & "-id)"
’......
代码说明:SQL语句中的Rnd的参数是一个数值表达式,必须包含表中的一个字段(最好是主键),因为变量r返回的是一个随机的0到1之间的single,(一般情况下表中的ID值都是大于1的),从而使参数的值是个小于0的随机数,由此产生了不同的随机序列。
补充一点,有一种提议用time来解决这个问题,就是"select top 10 * from tb order by rnd(" & time & "- id) "。在某些情况下是可以的,但是,如果你需要快速连续的查询信息,比如一些摇号程序需要连续滚动地显示信息,这种情况下,就会出现连续几次返回重复的信息。究其原因,就是time在做数值运算的时候,会转换为一个小于1的Double,而rnd返回的是一个Single,显然,rnd返回的结果有可能会截去time-id运算后的尾数,在time变化很小的情况下,使rnd返回的值与前次相同,从而返回的查询结果相同。
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-01-31
为什么不考虑把这个查询写入access里,然后再在vc里调用或者打开这个查询不就可以了吗?搞那么复杂干吗呢?
例如:rst.open "随机查询",cnn,1,3本回答被提问者采纳
第2个回答  2013-01-30
order by 理解错误。这个只管排序的正反,不管从哪开始。
如果需要设置过滤起点,要使用 where id>rnd...这样的语句,提示:建议使用取余数函数

...select top 10*from table order by rnd(ID); 但是每次都是一样...
Access数据库可以通过“select top 10 * from tb order by rnd(id)”得到随机数据,VBA环境下使用没有问题,可惜在VB中使用,产生的随机序列是一样的,每次调用返回的数据相同。有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单...

asp随机抽取数据库数据
随机提取10条记录的例子:Sql server:select top 10 * from 表 order by newid()Access:Select top 10 * FROM 表 orDER BY Rnd(id)Rnd(id) 其中的id是自动编号字段,可以利用其他任何数值来完成 比如用姓名字段(UserName)Select top 10 * FROM 表 orDER BY Rnd(len(UserName))MySql:Select ...

ACCESS中如何实现提取记录总数的方法
select top 5 * From Table1 order by Rnd()*5 这条语句可以随机从Access数据库中摄取5条记录。但是实际操作中,其生成的记录结果是固定的,失去了随机摄取记录的意义。方法三:有这样一种方法。利用随机数生成主键的记录ID yourstr="*1*3*4*6*12*..."然后用 sql="select top 10 * form y...

用VB 把access中的记录段排序
将记录集语句改写成如下即可:Select * from 你的数据库表的名称 order by 你需要排序在字段

当每次刷新页面时从sql数据库中读取不同10条数据
select top 1 * from table order by newid()top后面的数字就是你要随即搜索出来几条数据,这个方法只适用sql server SELECT top 4 * FROM 表 ORDER BY Rnd([一个自动编号字段])Randomize SELECT TOP 5 [TestTitle] FROM [TestTable] ORDER BY Rnd(-(TestID+"&Rnd()&"))这句适用于ACCESS...

SQL语句如何取前10条,10-30条记录?
10 sql server:读取前10条:select top (10) * from table1 where 1=1 读取后10条:select top (10) * from table1 order by id desc oracle:select * from table1 where rownum<=10 取10-30条的记录:select top 20 * from 表名 where id not in(select top 10 id from 表名)...

ASP网页SQL随机选择10条数据
你这个报错不是因为语句问题,而是因为你case的语法错误 请贴出这个页面从第50行到第90行的代码 另外,Rnd(ID)是ACCESS数据库中取字段ID中的随机值 如果你是MSSQL数据库,要用:Select TOP 10 * From shouye_1 Order By Newid()

access 随机数怎么弄?
MsSql随机取数据 select top 10 * from c_cy_admin order by newid()Access 随机取数据 select SELECT top 10 id FROM 表1 order by rnd(id)mySql 随机取数据 SELECT id FROM gueze order by rand() limit 10

sql 随机抽取几条数据的方法 推荐
Access:SELECT TOP 10 * FROM T_USER ORDER BY rnd([一个自动编号字段])这条语句在 Access 中的“查询”中是可以运行并得到随机结果的,但在 ASP.NET等后台程序代码中却无法得到预期的随机效果。正确的写法如下:以ASP.NET为例:Random random = new Random(System.Guid.NewGuid().GetHashCode()...

select TOP 10 * from dis order by id newid()
select TOP 10 * from dis order by newid()随机取前10条记录

相似回答