我已经调试下面的语句几个小时了:
SELECT
(
SELECT t1.anotherColumn
FROM table1 t1
WHERE t1.aColumn=(1+ABS(Checksum(NewId()))%54)
) res, *
FROM
(
SELECT TOP 200 * --PLEASE NOTICE HERE
FROM table2
)RESULT
问题是 res
每行始终包含相同的值。现在,如果我将查询语句中突出显示的 200
更改为 176
以下的任何数字,它会显示 table1
的随机行,这是所需的结果!
请注意,54
对结果没有影响,它之所以存在只是因为我的表中 aColumn
有 54 个从 1 到 54 的不同值。
我在不同的表上尝试过这个查询,并且这种奇怪的行为重复了!
最佳答案
结果的差异可能是由查询计划的差异造成的。
SQL优化器可以选择使用Table Spool/Lazy Spool操作符。在这种情况下,NEWID() 被调用一次,GUID 存储在临时表中并用于所有其他行。
https://technet.microsoft.com/en-us/library/ms191221(v=sql.105).aspx
... 更新: 可以通过在底部添加以下行来修复查询计划:
option(use plan
N'
<your XML plan>
')
要捕获“好的”XML 计划,请运行
SET SHOWPLAN_XML ON
并执行显示预期结果的查询。将其复制粘贴到选项(使用计划...)
此解决方案适用于大量行(数百万)
关于sql - SQL Server 的奇怪行为 - 随机选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39324055/