我们如何组合如何在SQL中请求随机行?和SQL Server 2005中的多个随机值,使用单个纯SQL查询选择N个随机行?理想情况下,我希望尽可能避免使用存储过程.这甚至可能吗?
澄清:
纯SQL指的是尽可能接近ANSI/ISO标准.
解决方案应该"足够有效".授予ORDER BY RAND()可能会有效,但正如其他人所指出的那样,这对于中型桌子来说是不可行的.
angry person.. 5
您问题的答案在第二个链接中:
SELECT * FROM table ORDER BY RAND() LIMIT 1
只需更改限制,和/或重写SQL Server:
SELECT TOP 1 * FROM table ORDER BY newid()
现在,这严格回答了您的问题,但您实际上不应该使用此解决方案。只需在一张大桌子上尝试,您就会明白我的意思。
如果您的键空间是连续的,或者没有孔,或者只有很少的孔,并且如果有很少的孔,那么您不必担心某些行被拾取的几率比其他行高,那么您可以使用一种变体,您在其中计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或大于您计算的数字的第一行。如果您的键空间有孔,则只需要“高于”部分。
此SQL留给读者练习。
编辑:注意,这里对另一个答案的评论提到,也许纯SQL意味着ANSI标准SQL。如果真是这样,那就没有办法了,因为没有标准化的随机函数,也不是每个数据库引擎都以相同的方式对待随机数函数。我见过至少一个引擎通过一次调用并仅对所有行重复计算出的值来“优化”该调用。
您问题的答案在第二个链接中:
SELECT * FROM table ORDER BY RAND() LIMIT 1
只需更改限制,和/或重写SQL Server:
SELECT TOP 1 * FROM table ORDER BY newid()
现在,这严格回答了您的问题,但您实际上不应该使用此解决方案。只需在一张大桌子上尝试,您就会明白我的意思。
如果您的键空间是连续的,或者没有孔,或者只有很少的孔,并且如果有很少的孔,那么您不必担心某些行被拾取的几率比其他行高,那么您可以使用一种变体,您在其中计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或大于您计算的数字的第一行。如果您的键空间有孔,则只需要“高于”部分。
此SQL留给读者练习。
编辑:注意,这里对另一个答案的评论提到,也许纯SQL意味着ANSI标准SQL。如果真是这样,那就没有办法了,因为没有标准化的随机函数,也不是每个数据库引擎都以相同的方式对待随机数函数。我见过至少一个引擎通过一次调用并仅对所有行重复计算出的值来“优化”该调用。