以随机顺序返回行

Ars*_*yan 106 sql t-sql sql-server

是否有可能编写每次查询运行时以随机顺序返回表行的SQL查询?

Dav*_*ker 167

SELECT * FROM table
ORDER BY NEWID()
Run Code Online (Sandbox Code Playgroud)

  • 对于MySQL,使用`ORDER BY uuid()`.(...对于那些通过通用搜索到达此页面的人,像我一样!) (50认同)
  • @John Kraft - 如果数字递增并且数字顺序中没有太多间隙,那么您可以使用RAND函数.声明InvoiceId INT SELECT InvoiceId = RAND()*(SELECT MAX(InvoiceId) - MIN(InvoiceId)FROM table)PRINT InvoiceId SELECT*FROM table Where InvoiceId = InvoiceId注意:InvoiceId应该有at符号但是SO对此不满意 (5认同)
  • @John - 您正在选择1400万条记录,并由uniqueidentifier生成和排序.也许你只是在一个随机排之后?在这种情况下,请执行SELECT TOP 1 FROM表ORDER BY NEWID() (4认同)
  • 这是有效的,但在我选择的桌子上(14M +行)非常慢.这是预料之中的吗?AFAIK,表格被正确编入索引. (2认同)
  • 这在 MySQL 中不起作用。 (2认同)

Ale*_*art 21

这是最简单的解决方案:

SELECT quote FROM quotes ORDER BY RAND() 
Run Code Online (Sandbox Code Playgroud)

虽然它不是最有效的.是一个更好的解决方案.

  • 很确定这不起作用.ORDER BY子句中的RAND()仅计算一次,因此您最终得到一个自然顺序.要测试它,请尝试ORDER BY RAND(),1,然后您将获得第一列(至少在SQL Server 2005中)排序的引号列表. (10认同)
  • 但是,是的,它适用于MySQL :) (5认同)
  • 这不起作用,我猜你也没有尝试过。RAND() 在 MS SQL Server 上的 SELECT 期间是固定的。您必须使用 NEWID() (3认同)
  • 嗯,我很确定这在过去对我有用,也许这取决于您使用的产品。 (2认同)
  • uuid() 和 newid() 技术在 mysql 上对我不起作用,这个答案却起作用。 (2认同)

dev*_*uff 12

通常的方法是使用NEWID()函数,该函数生成唯一的GUID.所以,

SELECT * FROM dbo.Foo ORDER BY NEWID();
Run Code Online (Sandbox Code Playgroud)