我在sql 2008中有2个表
Table1
Id Name Surname City
1000 Alex White London
1001 John Brown Brussels
..
Table2
Id Surgeon Room aId
1 Mike J. A104 1000
2 Jack S. C144 1001
...
我的查询如下:
Select a.Id,b.Id,
a.Name,a.Surname,a.City,b.Surgeon,b.Room
into #results
from Table1 a
inner join Table2 b on a.Id = b.aId
我想要做的是通过使用虚拟值而不是真实值来匿名化a.Id和b.Id隐私值。我之前添加了一个随机数学运算,如:
Select aId = a.Id * 22 / 5 + 14 * 2
,bId = b.Id * 12 / 4 + 7 * 3
...
但老实说,我在这里做的并不是很开心,我正在寻找更专业的方式来提供这个。任何建议将不胜感激。
答案 0 :(得分:0)
如果您不需要确定匿名ID是唯一的,并且您不需要根据匿名ID找到真实ID,则可以使用CheckSum()或{{ 3}}使用Table1和Table2中的字符串函数:
Select aId = CheckSum(a.Name + a.Surname) % 10000
,bId = HashBytes('SHA1', b.Surgeon) % 10000
,a.Name,a.Surname,a.City,b.Surgeon,b.Room
into #results
from Table1 a
inner join Table2 b on a.Id = b.aId
如果您需要确保表中的每个Id值都具有唯一值,并且还需要根据匿名ID查找真实ID,则可以按如下方式构建查找表:
CREATE TABLE Anon
(
ID INTEGER NOT NULL PRIMARY KEY,
AnonID UNIQUEIDENTIFIER DEFAULT NewID()
);
然后可以在不应返回实际ID的查询中使用它:
Select aID = Anona.AnonID,
bID = Anonb.AnonID,
a.Name,a.Surname,a.City,b.Surgeon,b.Room
into #results
from Table1 a inner join Table2 b on a.Id = b.aId
inner join Anon Anona on a.Id = Anona.Id
inner join Anon Anonb on b.Id = Anonb.Id
需要维护Anon表以确保它包含Table1和Table2中的所有ID。