access sql的Randomize问题(100分)

  • 主题发起人 主题发起人 lps
  • 开始时间 开始时间
L

lps

Unregistered / Unconfirmed
GUEST, unregistred user!
access中取随机N条记录的方法(参见:http://support.microsoft.com/kb/208855/en-us)
select top N * from aaa order by rnd(id)
可是每次运行程序,得到的结果序列是一样的,显然是未Randomize,如何让access能Randomize呢?
 
我针对一个非数字类型字段,得到结果是对的。返回来确实是随机的。
我使用了这样的语句。
SELECT top 4 商品销售明细查询.* FROM 商品销售明细查询 order by rnd(len(销售单号))
你也可以试试,针对一个非字符类型字段。
加上len就可以。
 
刚才我测试了数字类型字段,有时候不对。或者回来都是一样的。
但是你可以这样
select top N * from aaa order by rnd(len(id))
这样的结果会正确。
 
退出ACCESS后再进入测试,就会发现序列是不变的。
 
使用我这样的代码试试。
 
zywcd:
退出ACCESS后再进入测试, 不行的
 
我刚才测试了你说的,真的是重新进入以后不变。
但是,我做了这样的修改,然后就可以每次不重复,既是你重新启动access也可以。
select top N * from aaa order by rnd(len(id)+rnd)
相当于我加入了一个随机的种子。
 
还是一样的啊。len(id)+rnd在每次进去时必然是一样的种子
 
我在access2003测试每次进入得到的数据不同。
 
我的MDB文件是2000版本的,现在的关键是在Delphi 7中用ADO做出来的程序有这个问题,所以和ACCESS的版本无关,估计和ADO有关,但是这样的小程序也不大可能让人去装ACCESS或者升级ADO吧?
 
在程序中Randomize 把结果做参数去查询呢
 
SELECT TOP 5 *
FROM single_test_subject
ORDER BY rnd(2);
写成这样的话,top 5就不起作用了,结果是所有记录[:(]
 
你这样我也测试了,和你一样的结果。
你在rnd需要任意选择一个字段,
ORDER BY rnd(len(字段名称)+rnd);
我这样测试就对。不明白为什么你还是不对。
 
网中戏:你的方法应该是可行的,必竟DELPHI本身可以Randomize,这时取一个随机整数X(不能太大,比如说-50),然后先执行X次用到rnd函数的SQL。但这毕竟不是正确。
zywcd:能否把你的测试库发一个给我,我的email是liu_427@163.com
 
暂时使用了一个笨办法:用DELPHI本身产生一个随机整数X(1-100),然后在X次循环中反复执行SQL的CLOSE和OPEN, 这样有100种可能,用户就感觉不到重复了。
PS:主要是不想对程序改动太多

请大家继续出主意
 
后退
顶部