正如 Jiri Tousek 所说,您运行的每个查询都必须知道之前的查询返回了什么。
我不是在表中插入先前返回的行的 ID,然后检查新结果是否不在该表中,而是简单地向表中添加一列,其中包含将定义新的随机行顺序的随机数。
您使用随机数填充此列一次。
这将记住行的随机顺序并使其稳定,因此您在查询之间只需要记住到目前为止您请求了多少随机行。然后从您在上一个查询中停止的位置开始,根据需要获取尽可能多的行。
向表中添加一列RandomNumber binary(8)
。您可以选择不同的尺寸。8 个字节应该足够了。
用随机数填充它。一次。
UPDATE tablename
SET RandomNumber = CRYPT_GEN_RANDOM(8)
RandomNumber
在列上创建索引。唯一索引。如果事实证明存在重复的随机数(这对于 20,000 行和 8 字节长的随机数来说不太可能),则重新生成随机数(UPDATE
再次运行该语句),直到它们都是唯一的。
请求前 10 个随机行:
SELECT TOP(10) *
FROM tablename
ORDER BY RandomNumber
当您处理/使用这 10 个随机行时,请记住最后使用的随机数。最好的方法取决于你如何处理这 10 个随机行。
DECLARE @VarLastRandomNumber binary(8);
SET @VarLastRandomNumber = ...
-- the random number from the last row returned by the previous query
请求接下来的 10 个随机行:
SELECT TOP(10) *
FROM tablename
WHERE RandomNumber > @VarLastRandomNumber
ORDER BY RandomNumber
处理它们并记住最后使用的随机数。
重复。作为奖励,您可以在每次迭代中请求不同数量的随机行(不必每次都是 10)。