如何使用纯SQL选择N个随机行?

Gil*_*ili 10 sql random

我们如何组合如何在SQL中请求随机行?SQL Server 2005中的多个随机值,使用单个纯SQL查询选择N个随机行?理想情况下,我希望尽可能避免使用存储过程.这甚至可能吗?

澄清:

  1. 纯SQL指的是尽可能接近ANSI/ISO标准.
  2. 解决方案应该"足够有效".授予ORDER BY RAND()可能会有效,但正如其他人所指出的那样,这对于中型桌子来说是不可行的.

ang*_*son 5

您问题的答案在第二个链接中:

SELECT * FROM table ORDER BY RAND() LIMIT 1
Run Code Online (Sandbox Code Playgroud)

只需更改限制,和/或重写SQL Server:

SELECT TOP 1 * FROM table ORDER BY newid()
Run Code Online (Sandbox Code Playgroud)

现在,这严格回答了您的问题,但您实际上不应该使用此解决方案。只需在一张大桌子上尝试,您就会明白我的意思。

如果您的键空间是连续的,或者没有孔,或者只有很少的孔,并且如果有很少的孔,那么您不必担心某些行被拾取的几率比其他行高,那么您可以使用一种变体,您在其中计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或大于您计算的数字的第一行。如果您的键空间有孔,则只需要“高于”部分。

此SQL留给读者练习。


编辑:注意,这里对另一个答案的评论提到,也许纯SQL意味着ANSI标准SQL。如果真是这样,那就没有办法了,因为没有标准化的随机函数,也不是每个数据库引擎都以相同的方式对待随机数函数。我见过至少一个引擎通过一次调用并仅对所有行重复计算出的值来“优化”该调用。


use*_*861 1

我不知道纯 ANSI,而且它并不简单,但你可以在这里查看我对类似问题的回答: 来自 Sql 数据库的简单随机样本