简单的更新语句,以便为所有行分配不同的值

Eri*_*rix 3 sql sql-server

我正在尝试将一个表中的列设置为随机外键以进行测试.我尝试使用以下查询

update table1 set table2Id = (select top 1 table2Id from table2 order by NEWID())
Run Code Online (Sandbox Code Playgroud)

这将随机获得一个table2Id,并将其作为table1中的外键分配给每一行.这几乎是我想要的,但我想让每一行获得不同的table2Id值.

我可以通过循环遍历table1中的行来完成此操作,但我知道有一种更简洁的方法.

Mar*_*ith 8

在一些测试表上,我的结束您的原始计划如下所示.

原计划

它只计算一次结果并将其缓存在sppol中然后重放该结果.您可以尝试以下操作,以便SQL Server将子查询视为相关的,并且需要为每个外部行重新评估.

UPDATE table1
SET    table2Id = (SELECT TOP 1 table2Id
                   FROM   table2
                   ORDER  BY Newid(),
                             table1.table1Id)
Run Code Online (Sandbox Code Playgroud)

对我来说,这个计划没有线轴.

新计划

table1然而,重要的是关联一个唯一的字段,以便即使添加了一个假脱机,它也必须总是反弹而不是重绕(重放最后的结果),因为每行的相关值都不同.

如果表很大,这将是缓慢的,因为所需的工作是两个表的行的产物(对于table1它的每一行需要进行全面扫描table2)