获取一个随机的大型SQL表行

时间:2014-05-05 15:24:22

标签: sql

我想使用StackExchange Data Explorer获取一个未关闭的随机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();

然而,我总是得到相同的结果。这是因为查询是缓存的吗?没有缓存会有用吗?

2 个答案:

答案 0 :(得分:1)

即使我们在这些事情上使用“随机”这个词,但计算机本身也无法随意做任何事情。

这就是为什么他们将这些计算机功能描述为"伪随机"。任何时候你多次运行相同的东西,(除非它依赖于某些外部因素,如当前时间或某些东西),它将始终产生相同的结果。

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

答案 1 :(得分:1)

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 试试这个:

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