[英]SQL Update two tables with same randomized value
我有两个表,每个表包含匹配的社会安全号码。 我想在保持匹配的同时随机化SSN。
SET @NewSSN = 000000000 + FLOOR((CAST(ABS(CHECKSUM(NEWID())) AS FLOAT) / 2147483648) * (999999999 - 000000000))
我想获取该值并更新两个表,匹配原始SSN。 伪代码,我尝试了一些不同的变体:
UPDATE Table1, Table2
SET [Table1].[SocSecNum], [Table2].[SocSecNum] = @NewSSN
WHERE [Table1].[SocSecNum] = [Table2].[SocSecNum]
我能用这个方向工作的方向吗?
创建一个交叉引用表,将旧SSN映射到随机值,然后对Table1和Table2执行单独的update
查询以设置新SSN。
create table #SsnMap (OldSsn <datatype>, NewSsn <datatype>)
insert into #SsnMap (OldSsn)
select SocSecNum
from Table1
union -- distinct!
select SocSecNum
from Table2
update #SsnMap
set NewSsn = [random logic here]
update Table1
set SocSecNum = NewSsn
from #SsnMap
inner join Table1
on SocSecNum = OldSsn
update Table2
set SocSecNum = NewSsn
from #SsnMap
inner join Table2
on SocSecNum = OldSsn
Paul对查找表的想法非常合理。 但是,它有一些缺陷。 例如,重复是可能的。 如果您的表有10行或100行,则极不可能。 如果他们有10,000,000或100,000,000,他们更有可能。
此外,它假定table2中的所有值都在table1中。 并且,如果table1
或table2
具有重复的社会安全号码,则会出现问题。
所以,我建议只使用序列号,随机化顺序,组合两个表中的数据,并删除重复项:
select SocSecNum,
right('000000000' + cast(row_number() over (order by newid()) as varchar(255)), 9) as new_SocSecNum
into #SsnMap
from (select SocSecNum
from Table1
union -- on purpose to remove duplicates
select SocSecNum
from Table2
) s;
update t1
set SocSecNum = new_SocSecNum
from Table1 t1 join
#SsnMap s
on t1.SocSecNum = s.SocSecNum;
update t2
set SocSecNum = new_SocSecNum
from Table2 t2 join
#SsnMap s
on t2.SocSecNum = s.SocSecNum;
只是另一个选项,您可以使用HashBytes()来创建一致的地图。
两个简单的更新,不需要临时地图。
例
Declare @YourTable table (SSN varchar(25))
Insert Into @YourTable values
('555667777'),
('123456789')
Select SSN
,Masked = abs(cast(HashBytes('MD5',SSN) as int))
From @YourTable
结果
SSN Masked
555667777 246591824
123456789 459427083
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.