当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《如何使用纯SQL选择N个随机行?》经验,为你挑选了1个好方法。

我们如何组合如何在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。如果真是这样,那就没有办法了,因为没有标准化的随机函数,也不是每个数据库引擎都以相同的方式对待随机数函数。我见过至少一个引擎通过一次调用并仅对所有行重复计算出的值来“优化”该调用。



1> angry person..:

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

SELECT * FROM table ORDER BY RAND() LIMIT 1

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

SELECT TOP 1 * FROM table ORDER BY newid()

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

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

此SQL留给读者练习。


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

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有