从sql结果集中随机选择行?

从sql结果集中随机选择行?,sql,sql-server-2008,Sql,Sql Server 2008,我有一个查询,结果是10行、20行或任意数量的行。下面是查询 select bookname from bookstore where recommend='true' and Year(pubdate)='2013' 此查询可以提供任意数量的行 但是我只需要显示结果的4行。我可以选择前4名,但我想随机选择,这样用户在访问时,每年都不会显示相同的书名 请帮助我如何从结果中获取随机行 select bookname from bookstore where recom

我有一个查询,结果是10行、20行或任意数量的行。下面是查询

select bookname from bookstore where recommend='true' and Year(pubdate)='2013'
此查询可以提供任意数量的行

但是我只需要显示结果的4行。我可以选择前4名,但我想随机选择,这样用户在访问时,每年都不会显示相同的书名

请帮助我如何从结果中获取随机行

select 
   bookname 
from 
   bookstore 
where 
   recommend='true' and 
   Year(pubdate)='2013' 
order by 
   rand() 
limit 4
编辑:对于slq服务器,使用
newid()
而不是
rand()


编辑:对于slq服务器,请使用
newid()
而不是
rand()

我认为这行不通,我相信rand()只会在查询中计算一次,并且对所有行都是相同的:试试这个()否,false,它将为每一行调用。这表明它在MySQL和MSSql中的行为可能有所不同,因为它在MySQL中工作。@IanKenney在SQL server中一次,在MySQL中的每一行(但问题标记为SQL server,因此您的陈述是正确的)我认为这行不通,我相信rand()将只在查询中计算一次,并且对所有行都是相同的:试试这个()否,false,它将对每一行调用。这表明它在MySQL和MSSql中的行为可能不同,因为它在MySQL中工作。@IanKenney在SQL server中一次,对MySQL中的每一行都是如此(但问题被标记为SQL Server,因此您的陈述是正确的)请参见此处的“谢谢”。NEWID()是键。@JW웃 嘿,如果我们使用where子句得到10行,然后选择了前4行,那么使用ORDER BY NEWID()将其作为子查询检查@V…I…你到底是什么意思?@JW웃 表中有10行,6行使用where子句过滤掉,然后使用ORDER BY NEWID()应用TOP 4,但我们仍然得到随机行,包括使用TOP 4过滤掉的剩余2行。希望清楚。@JW웃 检查这个。谢谢。NEWID()是这里的键。@JW웃 嘿,如果我们使用where子句得到10行,然后选择了前4行,那么使用ORDER BY NEWID()将其作为子查询检查@V…I…你到底是什么意思?@JW웃 表中有10行,6行使用where子句过滤掉,然后使用ORDER BY NEWID()应用TOP 4,但我们仍然得到随机行,包括使用TOP 4过滤掉的剩余2行。希望清楚。@JW웃 看看这个。
SELECT TOP 4 bookname 
FROM   bookstore 
WHERE  recommend = 'true' AND
       Year(pubdate)='2013'
ORDER  BY NEWID()