Microsoft SQL Server随机行
我需要从SQL Server数据库中的一组行中随机获取一行 这是我当前运行的查询:Microsoft SQL Server随机行,sql,sql-server,Sql,Sql Server,我需要从SQL Server数据库中的一组行中随机获取一行 这是我当前运行的查询: SELECT TOP 1 * FROM (SELECT * FROM Flowers WHERE Color = 'Red') a ORDER BY NEWID() 据我所知,这应该能买到所有红色的花。然后从其中一朵中随机挑选一朵。但在我看来,它只是从数量相当少的条目中进行选择,因为我经常看到同一对花 所以现在我想知道,如果我的查询没有我想象的那么好,有人看到它有问题吗?您不必使用子查询,只需使用w
SELECT TOP 1 *
FROM
(SELECT * FROM Flowers WHERE Color = 'Red') a
ORDER BY NEWID()
据我所知,这应该能买到所有红色的花。然后从其中一朵中随机挑选一朵。但在我看来,它只是从数量相当少的条目中进行选择,因为我经常看到同一对花
所以现在我想知道,如果我的查询没有我想象的那么好,有人看到它有问题吗?您不必使用子查询,只需使用where子句和order by newid()直接从表中选择即可。像
SELECT TOP 1 *
FROM Flowers
WHERE Color = 'Red'
ORDER BY NEWID()
众所周知,
orderbynewid()
不能很好地随机化。使用orderbychecksum(NEWID())
您将获得更好的结果。那么,从Color=“Red”
返回的花中选择*多少行?。(另外,您应该使用带有单引号的WHERE Color='Red'
)这里有一个关于在sql中选择随机行的好链接-有多少红花,以及您多长时间会看到重复的?您确实需要做一些统计分析来确定结果的随机性。@Lamak我现在检查返回的行。我使用单引号,查询是从一些java字符串生成的,所以我忘了更改它。@Lamak伙计,我觉得自己很愚蠢。你说得对,我的数据库里只有17朵红花。我不知道为什么我没有看到…为什么这会返回与op使用的不同的行数,或者不同的结果?基本上是相同的查询它不会返回不同的行数,但是这里sql server不必返回所有color='Red'的行,只返回结果集中的一行。它肯定会进行相同的不必要的数据处理。优化器很可能会对您和op的查询使用相同的计划。像“派生表”这样琐碎的东西不会让优化器感到困惑,不一定,让事情保持简单总是更好的,你可以这样说吗:)但我可以说,这与op使用的查询完全相同,不会有任何区别。你能解释一下吗? 问题是什么?有没有链接来证明这一假设?@Lamak Itzik在一些操作系统中提到了这一点。2008年推出了CRYPT_GEN_RANDOM。@GordonLinoff我想我第一次听到它是很久以前的伊兹克。在互联网上有很多关于它的信息,例如在Technet上:@dean。文档中示例中使用的checksum()
是将newid()
转换为浮点,以便使用where
子句中的比较可以获得大约1%的样本。Martin的链接确实将此问题作为基于操作系统的问题来解决。有趣。