Eu sei que outras respostas aqui (e aqui ) dizem para pedir por newid()
. No entanto, se eu estiver selecionando top 1
em uma subconsulta - para gerar uma seleção aleatória por linha na consulta externa - usando newid()
produz o mesmo resultado todas as vezes.
Aquilo é:
select *,
(select top 1 [value] from lookupTable where [code] = 'TEST' order by newid())
from myTable
... produz o mesmo lookupTable.value
valor em cada linha retornada de myTable
.
Estou tentando escolher um valor aleatório de lookupTable
. Essa tabela tem apenas algumas linhas. No mundo real, eu quero update myTable set someColumn =
... um valor aleatório de lookupTable.value
modo que cada linha myTable
seja definida com um valor aleatório e não de forma que um único valor aleatório seja gerado e atribuído a todas as linhas.
Uma maneira de conseguir isso é garantir que a subconsulta esteja correlacionada, ou seja, depende de alguma forma da consulta externa. Usando um exemplo AdventureWorks:
db<>demonstração de violino
Sem a correlação, o SQL Server reconhece que a consulta interna logicamente só precisa ser executada uma vez.
O exemplo acima usa
CHECKSUM(E.BusinessEntityID, D.DepartmentID)
para garantir que a correlação pretendida permaneça após a otimização da consulta. Se apenas adicionarmosE.BusinessEntityID
, o otimizador perceberá que seu valor é constante por iteração, remove a dependência e voltamos ao ponto de partida.A semântica do exemplo também é ligeiramente diferente da consulta na pergunta. Ele não retorna NULL se lookupTable estiver vazio.