【发布时间】:2011-08-11 22:35:59
【问题描述】:
如何一次从一个表中选择 N 条随机记录,而不重复以前由同一操作返回的记录?
一个明显的解决方案是:
SELECT TOP 5 * FROM
MyTable
WHERE Id NOT IN (SELECT Id FROM PreviouslyReturned)
ORDER BY newid()
但是随着 MyTable 开始增长,这不是效率很低吗?
我有一个很长的记录列表,我一次需要 5 条记录来进行回合制游戏,而不会重复给定游戏已经提取的任何记录。因为我知道大约会发生多少回合,所以我可以在游戏开始之前选择一个非常大的随机样本,但我宁愿它是“动态的”。我找到了this question,它使用 MySQL 的随机种子。
最终会有如此多的记录,重复不会成为问题(记录>> N),但在那之前,我需要记录是唯一的。在旁注中,我使用 Fluent NHibernate 作为我的持久层;也许 NHibernate 有一些允许这样做的功能。
【问题讨论】:
-
“最终会有如此多的记录,重复不会成为问题。”除非你能保证你的伪随机数生成器永远不会连续两次给你相同的值,否则我不知道你怎么能做出这样的陈述。
-
@Jim,我的意思是,千载难逢的重复对我的申请来说没什么大不了的。
-
你的直觉可能在这里错了,Birthday problem。
标签: sql sql-server fluent-nhibernate random unique