你的位置: 首页 > HTML5网站开发 > 正文
转:如何使得order by rnd(id)真正实现随机抽取数据库中记录
作者:漫游   分类: HTML5网站开发    时间:2012-7-5 17:49   热度:8530°   字号:        评论:0 
作者:漫游   分类: HTML5网站开发    时间:2012-7-5 17:49   热度:8530°  评论:0 条 
  SQL server数据库有个NewID函数,可以很方便的用SQL语句得到数据表中的随机数据。但Access数据库没这么方便,虽然有个Rnd,可以通过“select top 10 * from tb order by rnd(id)”得到随机数据,VBA环境下使用没有问题,可惜在VB中使用,产生的随机序列是一样的,每次调用返回的数据相同。

  有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单,Randomize不可能影响SQL语句中的Rnd,这个Rnd只不过是个字符串,SQL语句是通过数据库引擎去执行的,正因为如此,无法初始化种子,致使每次应用产生的随机序列是一样的。

  由此可见,解决问题的关键就是如何初始化随机种子。Rnd函数语法是Rnd(number),它有一个特性,就是如果使用了负参数的number,那么就会产生一个固定的随机序列。利用这个特性,我们的问题就迎刃而解了,这就是每次调用Rnd函数时,使用一个负的不同的number,从而达到产生不同随机序列的目的。经过测试,问题解决。示例代码如下:        

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

  代码说明:SQL语句中的Rnd的参数是一个数值表达式,必须包含表中的一个字段(最好是主键),因为变量返回的是一个随机的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返回的值与前次相同,从而返回的查询结果相同。
瞧瞧上一篇文章去!   瞧瞧下一篇文章去!
本文标签: ASP SQL
二维码加载中...
本文作者:漫游      文章标题: 转:如何使得order by rnd(id)真正实现随机抽取数据库中记录
本文地址:http://www.roammemo.com/html5/96.html
版权声明:若无注明,本文皆为“漫游的备忘录”原创,转载请保留文章出处。
返回顶部    首页    手机版本   
版权所有:漫游的备忘录    站长: 漫游    模板基于:博闻广记 v1.2   程序:emlog