繁体   English   中英

SQL Update两个具有相同随机值的表

[英]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中。 并且,如果table1table2具有重复的社会安全号码,则会出现问题。

所以,我建议只使用序列号,随机化顺序,组合两个表中的数据,并删除重复项:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM