SQL Update две таблицы с одинаковым рандомизированным значением - PullRequest
0 голосов
/ 23 мая 2018

У меня есть две таблицы, каждая из которых содержит соответствующие номера социального страхования.Я хочу рандомизировать номера 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 голосов
/ 23 мая 2018

Идея Пола о поисковой таблице вполне разумна.Тем не менее, у него есть некоторые недостатки.Например, возможны дубликаты.Они маловероятны, если в ваших таблицах 10 или 100 строк.Они гораздо более вероятны, если у них есть 10 000 000 или 100 000 000.

Кроме того, предполагается, что все значения в таблице2 находятся в таблице1.И это имеет проблему, если 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;
0 голосов
/ 23 мая 2018

Просто еще один вариант, вы можете использовать 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
0 голосов
/ 23 мая 2018

Создайте таблицу перекрестных ссылок, которая сопоставляет старые SSN с рандомизированными значениями, затем выполните отдельные запросы update к Table1 и Table2, чтобы установить новые 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...