我想使用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();
然而,我总是得到相同的结果。这是因为查询是缓存的吗?没有缓存会有用吗?
答案 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