主题:  怎样不使用newid()随机去取出一条记录?

GHL

职务:普通成员
等级:1
金币:0.0
发贴:15
#12004/10/24 14:08:02
数据库使用的是MSSQL,我想在符合一些条件(比如price>3)的记录中随机取出一条。

select top 1 title from [abc] where price>3 order by newid()


上面的执行速度不怎么好,有没有更快的方法呢?



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#22004/10/24 20:03:12
不知有没有随机函数,我想全部选出到数据集后,再用编程随机抽取更好些,而且更灵活。


非常大鱼

蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#32004/10/30 10:35:28
排序方法:
SELECT *
FROM Northwind
ORDER BY NEWID()
取一条用 TOP 1就行了


非常大鱼

GHL

职务:普通成员
等级:1
金币:0.0
发贴:15
#42004/10/30 10:43:45
上次看到一篇文章,就拿来试了一下,好像比newid()快一些

Dim rndMax,rndNumber
rndMax = conn.execute("select count(id) from [abc] where price>1")(0)
randomize timer
rndNumber = int(rnd*rndMax)
Set rs = Conn.execute("select title from [abc] where price>1")
rs.Move rndNumber
title = rs(0)
rs.close

在同样的记录数,newid排序耗130~140ms,上面的方法耗30~80ms。。。



蓝鲸

职务:版主
等级:5
金币:42.1
发贴:2614
#52004/10/30 10:55:05
多谢ghl,学了一招。
看来newid还是较耗时的。
近来我也在想这个,比如服务器数据库用SQL SERVER,而轻便型的客户应用程序用ACCESS,但ACCESS不支持这NEWID。如果想把客户端的数据导入到SQL SERVER上去,又要保持各表ID号之间连接的完整性,又什么好的办法。


非常大鱼