如何用同一随机值更新两张含匹配SSN的表?
解决两表SSN随机化且保持匹配的问题
我来帮你搞定这个需求!核心要点是给每个唯一的原SSN分配一个专属的随机新SSN,然后基于这个映射关系去更新两张表,这样就能保证同一个原SSN在两个表里的新值完全一致。
你的原伪代码问题在于:直接用@NewSSN会把所有匹配的SSN都改成同一个随机值,这显然不是你想要的——我们需要每个原SSN对应自己的新SSN,而不是全局统一一个。
正确实现步骤
1. 生成原SSN到新SSN的映射表
首先创建一个临时表,把所有唯一的原SSN和对应的随机新SSN关联起来,这一步是关键,确保每个原SSN只生成一次新值:
-- 创建临时映射表,包含所有唯一的原SSN和对应的新SSN SELECT DISTINCT SocSecNum AS OriginalSSN, -- 使用你提供的随机SSN生成逻辑 000000000 + FLOOR((CAST(ABS(CHECKSUM(NEWID())) AS FLOAT) / 2147483648) * (999999999 - 000000000)) AS NewSSN INTO #SSNMap FROM Table1 -- 把Table2中独有的SSN也加入映射表(如果有的话) INSERT INTO #SSNMap (OriginalSSN, NewSSN) SELECT DISTINCT SocSecNum, NULL FROM Table2 WHERE SocSecNum NOT IN (SELECT OriginalSSN FROM #SSNMap); -- 给Table2独有的SSN生成新SSN UPDATE #SSNMap SET NewSSN = 000000000 + FLOOR((CAST(ABS(CHECKSUM(NEWID())) AS FLOAT) / 2147483648) * (999999999 - 000000000)) WHERE NewSSN IS NULL;
2. 基于映射表更新两张表
有了映射表之后,就可以分别更新Table1和Table2了:
-- 更新Table1的SSN UPDATE t1 SET t1.SocSecNum = m.NewSSN FROM Table1 t1 INNER JOIN #SSNMap m ON t1.SocSecNum = m.OriginalSSN; -- 更新Table2的SSN UPDATE t2 SET t2.SocSecNum = m.NewSSN FROM Table2 t2 INNER JOIN #SSNMap m ON t2.SocSecNum = m.OriginalSSN; -- 清理临时表 DROP TABLE #SSNMap;
可选优化:确保新SSN绝对唯一
如果你需要严格保证新SSN没有重复(虽然用NEWID()生成的重复概率极低),可以调整映射表的生成逻辑,用ROW_NUMBER()结合随机排序来生成唯一值:
WITH AllUniqueSSNs AS ( -- 收集两个表中所有唯一的原SSN SELECT DISTINCT SocSecNum AS OriginalSSN FROM Table1 UNION SELECT DISTINCT SocSecNum AS OriginalSSN FROM Table2 ), RandomOrdered AS ( -- 给每个原SSN分配随机排序的序号 SELECT OriginalSSN, ROW_NUMBER() OVER (ORDER BY NEWID()) AS RandomRowNum FROM AllUniqueSSNs ) -- 生成唯一的9位新SSN(这里用100000000 + 序号,保证不重复) SELECT OriginalSSN, RIGHT('000000000' + CAST(100000000 + RandomRowNum AS VARCHAR(9)), 9) AS NewSSN INTO #SSNMap FROM RandomOrdered;
这样生成的新SSN绝对不会重复,适合对唯一性要求极高的场景。
内容的提问来源于stack exchange,提问作者Blaze
相关产品推荐
相关产品推荐

