挑战大富翁!!!!!!!!!!! (300分)

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
WZS兄:
1、必须有ID这是肯定的,我个人认为,NEWID()这个函数32位的GUID,也是已经在表上隐性地
加了个ID了,否则ORDER BY NEWID()这个字段从何而来???
3:该SQL有可能无记录返回,假设有1条的时候,就玩完了 呵呵<<
一般来说,你的记录是10000条的话,那么rand()*10000产生的数值是1----10000
应该不会出现你所说的空记录!《假设有1条的时候,就玩完了》至于这句我就不懂了!:)
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
假设你的ID 从1开始:
CAst(RAND() * 1 AS int) 按你的想法有可能是0,那就无记录
假设你的ID 从0开始:同理 有可能是1
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
RAND
返回 0 到1 之间的随机float 值.是指>0而<1的值,我的ID是从1开始的,所以不会出现空值!
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
as int 之后应为0
你的提议虽有点烦琐,但我会考虑
问题是我要求任意表,还有效率,时间短等
你的sql还的要求记录总数,有唯一ID 等
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
你加个ID为自增型就可!
还有效率,时间短等
~~~~~~~~~~~~~~~~~~
对于这点用ORDER BY效率会好吗?
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
sql还的要求记录总数,
~~~~~~~~~~~~~~~~~~~~这个改成这样就行!
SELECT f.*
FROM f,
(SELECT COUNT(*) AS cou
FROM f) b
WHERE (ID = CAST(RAND() * b.cou AS int))
 

荷塘新月

Unregistered / Unconfirmed
GUEST, unregistred user!
你出这个帖子的目的是什么?如果仅仅是为了某种算法,那就太没有实际意义了,如果是
为了某个项目,可以采取其他的方法。
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
天真: 玩的很好吗!! 关于时间,效率 ,也是我发这贴的目的。探讨一下。
我的方法和你的方法,哪种更快? 如果你的比较快,先给你记上100分!

自增型字段当有删除情况发生时,会发生不连续现象。
如 1 大师傅大师傅但是
2 电风扇地方但是
3 发射点犯得上法
。。。
删除2,则id 就没了2的记录 ,你的sql就有可能无记录
荷塘新月:说来听听!
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
强烈抗议YYSUN的手下 把我的贴子 去掉好多的‘!!!!!!!!!’
标题不显眼了!? (心里难受)
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
对这个问题倒没想到,不好意思,用ROWCOUNT代替ID好了
不过好只能用在触发器和存储过程中
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
oracle 的限制行数这么没人告诉我。
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
oracle :
select * from (select * from test order by sys_guid()) where rownum=1
 
Z

zhanggeye

Unregistered / Unconfirmed
GUEST, unregistred user!
是不容易做到。newid()和sys_guid()给表加了一列,肯定是慢了。
一时也想不出什么办法,不过在有ID并索引后这样做不知会不会快点:
declare @maxid int
declare @locid int
select @maxid =max(id) from test
select @locid =ceiling(@maxid*rand())
select top 1 * from test where id>=@locid order by id asc
if @@rowcount=0
select top 1 * from test where id <=@locid order by id desc
 
A

Alix

Unregistered / Unconfirmed
GUEST, unregistred user!
各位dfw们, 如果你们从有原理上来说明你们各自的做法,
我想大家就不必要在这里争来争去了
 
A

Alix

Unregistered / Unconfirmed
GUEST, unregistred user!
各位dfw们, 如果你们从有原理上来说明你们各自的做法,
我想大家就不必要在这里争来争去了
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
求更快更有效率的SQL
 

天真

Unregistered / Unconfirmed
GUEST, unregistred user!
WZS,我没用过ORCAL所以也不好说什么的,不好意思!
 
W

wzs

Unregistered / Unconfirmed
GUEST, unregistred user!
继续。。。。。。
 

萧月禾

Unregistered / Unconfirmed
GUEST, unregistred user!
刚刚试了一下,wzs的方法很不错呀
以后如果需要在服务器端随机取1条或多条记录
我应该会用这个办法
 

李衍智

Unregistered / Unconfirmed
GUEST, unregistred user!
天真:
你的做法已接近答案了。
不介意我把你的语句改一下吧?
SELECT top 1 f.*
FROM f,
(SELECT COUNT(*) AS cou
FROM f) b
WHERE (id <= CAST(RAND() * b.cou AS int))
 

Similar threads

顶部