使用另一表随机值替换目标表单列时所有行被赋同一值如何解决
问题根源
- 笔误问题:原语句存在两处字段名错误,源表
#test2存储候选值的字段为src1而非LastName,且需求是替换#test.col2,原语句错误修改了col1字段。 - 执行逻辑问题:
CROSS APPLY关联的子查询没有引用外部#test表的任何字段,SQL Server查询优化器会将该子查询判定为独立的常量查询,仅执行一次生成随机结果,所有目标表行都会复用这同一个结果,就出现了全表字段值相同的问题。
修复方案
只需要在子查询中增加一个和外部#test表字段关联的恒真条件,强制优化器遍历#test每一行时都重新执行一次子查询、生成新的随机值即可。WHERE #test.col2 = #test.col2看起来是无意义的恒真条件,核心作用是建立子查询和外部行的依赖关系,避免优化器做常量折叠,修正后的语句如下:
UPDATE #test SET col2 = data1.src1 FROM #test CROSS APPLY (SELECT TOP(1) #test2.src1 FROM #test2 -- 建立和外部行的依赖,强制每行重新计算随机值 WHERE #test.col2 = #test.col2 ORDER BY NEWID()) data1
效果说明
执行后#test表的每一行col2字段都会独立从#test2.src1的候选值中随机选取,不会出现全行统一值的情况。
内容的提问来源于stack exchange,提问作者Andy
相关产品推荐
相关产品推荐

