- 精品下载 | 实用查询 | 词典查询 | 桌面壁纸 | 网址 | 笑话 | FLASH频道 | 天气文章资讯 | 站长工具 | 证件办理 | 闪字生成 | 广告代码 | 在线手册 | 有问必答
您现在的位置: 蓝派网 >> 文章中心 >> 网络编程 >> ASP >> 正文
站内文章搜索:           

ACCESS和MSSQL里如何随机取出数据库的纪录

作者:佚名    文章来源:网络转载    更新时间 :2007-12-10 11:17:12

ACCESS和MSSQL里如何随机取出数据库的纪录

在MSSQL 里
查询语句只要这样写,就可以随机取出记录了

SQL="Select top 6 * from Dv_bbs1 where isbest = 1 and layer = 1 order by newID() desc"

在ACCESS里
SELECT top 15 id FROM tablename order by rnd(id)

 

SQL数据库有个newid函数,可以很方便的用SQL语句得到表中的随机数据。但access数据库没这么方便,虽然有个Rnd,可以通过“select   top   10   *   from   tb   order   by   rnd(id)”得到随机数据,可惜在VB中使用,产生的随机序列是一样的。

有人说在程序中加上Randomize初始化随机种子,那么这只说对了一半,在程序中简单的加上Randomize,是没作用的,道理很简单,Randomize不可能影响SQL语句中的rnd,那只不过是个字符串,SQL语句是放到jet中去执行的。

前些天在论坛上看到有人说用time,那么只用rnd(time)这样是不行的,rnd中必须要包含表中的一个字段(任意字段,当然是主键效果更好),测试下来,rnd(time+id)这样依然不行!   不过非常意外的是rnd(time-id)却成功了。为什么说意外,按我的理解,time在与数值做运算时,会转换成一个小于1的double,这样与ID(大于1的正值)做减运算的结果必然是一个负数,我们知道rnd如果用了负数种子,会产生相同的随机序列,这是文件加解密算法中常用到的方法,可在这儿却能得到正确的结果,到现在也没想通......

接下去,用rnd(time-id)继续测试你会发现,连续快速地查询下,会有问题,会出现二次或三次查询结果一样的问题。分析一下可以找到原因,rnd(number)中的number是个single,这样它会截断time-id这个运算结果double后面数字,这样快速查询时number这个值没改变,所以查询结果也没有改变

总结一下上面的测试,结论就是蔘access中用SQL语句产生随机数据时,rnd的种子必须是一个负的single,这样最后的结果就是:

......
        Dim   sql   As   String
        Dim   r   As   Single
        Randomize
        r   =   Rnd
        sql   =   "select   top   1   *   from   tb   order   by   rnd( "   &   r   &   "-id) "
......

Select * FROM table1 orDER BY Rnd(-Rnd(ID))


发表评论】【打印此文】【关闭窗口】【点击数:
★好玩的休闲小游戏★
网友评论:
数据载入中,请稍后……