正如吉日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)。
显示样本数据请。 – NEER