我知道这里(和这里)的其他答案说按newid()
. 但是,如果我top 1
在子查询中进行选择 - 以便在外部查询中为每行生成一个随机选择 - 每次使用newid()
都会产生相同的结果。
那是:
select *,
(select top 1 [value] from lookupTable where [code] = 'TEST' order by newid())
from myTable
lookupTable.value
...在从 . 返回的每一行上产生相同的值myTable
。
我正在尝试从中选择一个随机值lookupTable
。该表只有几行。在现实世界中,我想update myTable set someColumn =
...一个随机lookupTable.value
值,以便为每一行myTable
设置一个随机值,而不是生成一个随机值并将其分配给所有行。
实现此目的的一种方法是确保子查询是相关的,即它以某种方式依赖于外部查询。使用 AdventureWorks 示例:
db<>小提琴演示
如果没有关联,SQL Server 会识别出内部查询在逻辑上只需要运行一次。
上面的示例
CHECKSUM(E.BusinessEntityID, D.DepartmentID)
用于确保在查询优化后保持预期的相关性。如果我们只是添加E.BusinessEntityID
,优化器会意识到它的值在每次迭代中都是恒定的,移除依赖关系,然后我们又回到了开始的地方。示例的语义也与问题中的查询略有不同。如果lookupTable为空,它不会返回NULL 。