我在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值匿名为a.ID和B.ID值。我之前添加了一个随机的数学操作,例如:
Select aId = a.Id * 22 / 5 + 14 * 2
,bId = b.Id * 12 / 4 + 7 * 3
...
,但老实说,我并不感到非常高兴,我正在寻找一种更具教授的方式来提供这一点。任何建议都将不胜感激。
如果您不需要确定匿名ID是唯一的,并且不需要根据匿名ID找到真实ID,则可以使用checksum()或hashbytes()函数,带有来自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。