获取大型SQL表的随机一行



我想使用StackExchange数据浏览器获得1个未关闭的随机Java问题:

DECLARE @tagId int;
SELECT  @tagId = Id
FROM    Tags         
WHERE   TagName = 'java';
SELECT TOP 1 * FROM posts p join PostTags pt on pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.ClosedDate IS NULL
Order by newid();

然而,我总是得到相同的结果。这是因为查询被缓存了吗?如果没有缓存,它能工作吗?

SQL首先应用Top 1子句,然后进行排序,这就是你得到相同结果的原因。

试试这样写:

DECLARE @tagId int;
SELECT  @tagId = Id
FROM    Tags         
WHERE   TagName = 'java';
;WITH CTE AS 
(SELECT * FROM posts p join PostTags pt on pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.ClosedDate IS NULL
Order by newid();
) 
SELECT TOP 1 * FROM CTE

OR Try this:

DECLARE @tagId int;
SELECT  @tagId = Id
FROM    Tags         
WHERE   TagName = 'java';
SELECT TOP 1 * FROM 
(SELECT TOP 100 PERCENT * FROM posts p join PostTags pt on pt.PostId = p.Id
WHERE pt.TagId = @tagId
AND p.PostTypeID = 1
AND p.ClosedDate IS NULL
Order by newid();
) A

尽管我们用"随机"这个词来形容这类事情,但情况仍然是,计算机本身不能随机地做任何事情。

这就是为什么他们把这些计算机功能描述为"伪随机"。无论何时你多次运行同一件事,(除非它依赖于一些外部因素,如当前时间或其他东西)它总是会生成相同的结果。

如果你真的想每次都生成一个不同的值,那么你必须使用随机函数的一个变体(大多数语言都有这个功能),它将"种子"值作为输入参数,并使用当前时间(以刻度或毫秒为单位,或类似的东西)作为"种子"。

相关内容

  • 没有找到相关文章

最新更新