SQL Server 2008中匿名ID值的最佳方法是什么?



我在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。

相关内容

最新更新