you*_*gme 0 sql-server random sql-server-2016
我知道这里(和这里)的其他答案说要订购newid()。但是,如果我top 1在子查询中进行选择- 以便在外部查询中的每行生成随机选择 - 每次使用都会newid()产生相同的结果。
那是:
select *,
(select top 1 [value] from lookupTable where [code] = 'TEST' order by newid())
from myTable
Run Code Online (Sandbox Code Playgroud)
...lookupTable.value在从 返回的每一行上产生相同的值myTable。
我正在尝试从lookupTable. 那个表只有几行。在现实世界中,我想要update myTable set someColumn = ......一个随机lookupTable.value值,这样每一行都myTable设置了一个随机值,而不是生成一个随机值并将其分配给所有行。
实现这一点的一种方法是确保子查询是相关的,即它以某种方式依赖于外部查询。使用 AdventureWorks 示例:
SELECT
E.BusinessEntityID,
R.DepartmentID
FROM HumanResources.Employee AS E
CROSS APPLY
(
SELECT TOP (1)
D.DepartmentID
FROM HumanResources.Department AS D
ORDER BY
NEWID(),
CHECKSUM(E.BusinessEntityID, D.DepartmentID) -- Correlation
) AS R;
Run Code Online (Sandbox Code Playgroud)
如果没有关联,SQL Server 会识别出内部查询在逻辑上只需要运行一次。
上面的示例CHECKSUM(E.BusinessEntityID, D.DepartmentID)用于确保在查询优化后保留预期的相关性。如果我们只是 add E.BusinessEntityID,优化器会意识到它的值在每次迭代中都是恒定的,移除依赖关系,我们又回到了开始的地方。
示例的语义也与问题中的查询略有不同。如果lookupTable为空,它不会返回 NULL 。