我想使用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
尽管我们用"随机"这个词来形容这类事情,但情况仍然是,计算机本身不能随机地做任何事情。
这就是为什么他们把这些计算机功能描述为"伪随机"。无论何时你多次运行同一件事,(除非它依赖于一些外部因素,如当前时间或其他东西)它总是会生成相同的结果。
如果你真的想每次都生成一个不同的值,那么你必须使用随机函数的一个变体(大多数语言都有这个功能),它将"种子"值作为输入参数,并使用当前时间(以刻度或毫秒为单位,或类似的东西)作为"种子"。