SQL Update两个具有相同随机值

时间:2018-05-23 14:54:25

标签: sql sql-server sql-server-2008

我有两张桌子,每张桌子都包含相应的社会安全号码。我想在保持匹配的同时随机化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]

我可以使用此方法的任何方向吗?

3 个答案:

答案 0 :(得分:2)

创建一个交叉引用表,将旧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

答案 1 :(得分:1)

保罗对查询表的想法非常合理。但是,它有一些缺陷。例如,重复是可能的。如果您的表有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;

答案 2 :(得分:0)

只是另一种选择,您可以使用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