如何使用无关联的另一张临时表中的值更新表(替换NEWID())
如何使用无关联的另一张临时表中的值更新表(替换NEWID())
看起来你是想把原本用NEWID()生成的随机GUID,换成从临时表#tmpGUIDs里预先生成的GUID值,但两个表没有直接的关联键对吧?其实这个问题很好解决——我们只需要给要更新的目标行和临时表的GUID行分别加上「顺序标识」,然后通过这个标识来匹配更新就可以了。
核心思路
因为两张表没有天然的关联字段,我们就手动给它们加一个「行号」作为临时关联键:
- 给
@List中需要更新的行(NewFlag=1的行)生成连续的行号 - 给
#tmpGUIDs里的GUID行也生成对应的连续行号(如果你的临时表已经有连续的rnum,这一步可以简化) - 通过行号关联两张表,完成更新
具体实现代码
情况1:#tmpGUIDs的rnum已经是连续的(从1开始)
如果你的临时表#tmpGUIDs里的rnum是从1开始的连续整数,直接用下面的语句即可:
WITH TargetRows AS ( SELECT NewKey, -- 这里的ORDER BY可以根据你的需求调整,比如按原表的ID、创建时间排序,确保更新顺序符合预期 -- 如果没有特定顺序要求,用(SELECT NULL)即可生成任意顺序的行号 ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rnum FROM @List WHERE NewFlag = 1 ) UPDATE TargetRows SET NewKey = tmp.uuid FROM TargetRows tr JOIN #tmpGUIDs tmp ON tr.rnum = tmp.rnum;
情况2:#tmpGUIDs的rnum不连续或不是从1开始
如果你的临时表rnum不是连续的,我们可以先给它重新生成连续的行号,再进行关联:
WITH TargetRows AS ( SELECT NewKey, ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rnum FROM @List WHERE NewFlag = 1 ), OrderedGUIDs AS ( SELECT uuid, -- 按临时表原有的rnum排序,生成新的连续行号 ROW_NUMBER() OVER (ORDER BY rnum) AS rnum FROM #tmpGUIDs ) UPDATE TargetRows SET NewKey = og.uuid FROM TargetRows tr JOIN OrderedGUIDs og ON tr.rnum = og.rnum;
重要注意事项
- 数量匹配:一定要确保
#tmpGUIDs里的GUID数量 ≥@List中NewFlag=1的行数,否则会有部分行无法被更新(因为找不到匹配的行) - 排序可控:如果需要更新的行和GUID有特定的对应顺序,一定要在
ROW_NUMBER()的ORDER BY子句里指定具体的列(比如原表的主键、创建时间),不要用(SELECT NULL),否则匹配顺序是不可控的 - 重复检查:如果
#tmpGUIDs里的uuid有重复,更新后目标表的NewKey也会出现重复,记得提前确保临时表的GUID是唯一的
备注:内容来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

