Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/svn/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Microsoft SQL Server随机行_Sql_Sql Server - Fatal编程技术网

Microsoft 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

我需要从SQL Server数据库中的一组行中随机获取一行

这是我当前运行的查询:

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的链接确实将此问题作为基于操作系统的问题来解决。有趣。