我们如何组合How to request a random row in SQL?和Multiple random values in SQL Server 2005使用单个纯SQL查询选择N个随机行?理想情况下,我希望尽可能避免使用存储过程。这甚至可能吗?
澄清:
答案 0 :(得分:4)
你的问题的答案在第二个链接:
SELECT * FROM table ORDER BY RAND() LIMIT 1
只需更改SQL Server的限制和/或重写:
SELECT TOP 1 * FROM table ORDER BY newid()
现在,这个严格回答你的问题,但你真的不应该使用这个解决方案。只要在一张大桌子上试试,你就会明白我的意思。
如果您的键区是连续的,无论是没有孔,还是只有很少的孔,如果它的孔很少,你就不会太担心某些行的拾取机会比其他行略高一些,那么您可以使用变量来计算要随机检索的键,范围从1到表中的最高键,然后检索键等于或高于您计算的键的第一行。如果你的密钥空间有洞,你只需要“高于”部分。
此SQL留给读者作为练习。
编辑:注意,此处对另一个答案的评论提到可能纯SQL 表示ANSI标准SQL。如果是这种情况,则没有办法,因为没有标准化的随机函数,每个数据库引擎也不会以相同的方式处理随机数函数。至少有一个我见过的引擎通过调用它来“优化”调用一次,只是重复所有行的计算值。
答案 1 :(得分:2)
我不知道纯ANSI,它并不简单,但你可以在这里查看我对类似问题的回答: Simple Random Samples from a Sql database
答案 2 :(得分:1)
这是一个潜在的解决方案,可以让您平衡从表格的“前面”获取少于N行的风险与采样偏差。这假设N与表的大小相比较小:
select * from table where random() < (N / (select count(1) from table)) limit N;
这通常会对大部分表进行采样,但返回的行数少于N行。如果有一些偏差是可以接受的,则分子可以从N更改为1.5 * N或2 * N,以使很可能返回N行。此外,如果需要随机化行顺序,而不仅仅是选择一个随机子集:
select * from (select * from table
where random() < (N / (select count(1) from table)) limit N)
order by mod(tableid,1111);
这个解决方案的缺点是,至少在PostgreSQL中,它使用表的顺序扫描。分子越大,查询速度越快。
答案 3 :(得分:-1)
这可能会对你有所帮助:
SELECT TOP 3 * FROM TABLE ORDER BY NEWID()
答案 4 :(得分:-2)
使用下面的代码,你可以实现你想要的......
select top 1 * from student1 order by newid()
更改前1位的N值,这样您就会收到该数量的随机记录。