2012-10-09 64 views
0

我有一个员工表,其中包含多个用于同一个人的条目。 使用他们的SIN号码,你可以确定他们是否是同一个人。MS SQL Server - 为用户创建唯一密钥

例子:

Id Name SIN 
1 John Smith 1234 
2 John Smith 1234 
3 Jess Jones 4321 

我希望能够在这个表中复制大家,到一个新表。 我想创建一个新的列(UserKey [GUID]),该列对于表中的用户而言是多次唯一的。 我想使用这个新的UserKey [GUID]而不是SIN号码。

Example: 
Id Name  UserKey (Guid) 
1 John Smith 1234DFKJ2328LJFD 
2 John Smith 1234DFKJ2328LJFD 
3 Jess Jones 9543SLDFJ28EKJFF 

我对如何处理这个查询不知道。任何帮助都会很棒。

我正在使用MS SQL Server 2008.

谢谢。

+0

该GUID应该如何生成?更新密钥有什么意义? – LittleBobbyTables

+0

每人独特,而不是行本身。基本上需要与源表完全相同的数据,但是要获取SIN号并将其转换为GUID。 – PsychoDUCK

+0

我明白现在是每个用户,但你的结构没有意义。为什么用户不止一次被允许进入?当网络效应相同时,为什么要将密钥从1234更新到1234DFKJ2328LJFD?这似乎很多工作没有。 – LittleBobbyTables

回答

3

您可以创建一个临时表,将SIN映射到新的GUID。然后,您可以使用映射表来加入原始表,并从中创建新表。

# Create a table called #temp with the mappings SID => new GUID 
SELECT SIN, newid() UserKey INTO #temp FROM (SELECT DISTINCT SIN FROM Table1) a 

# ...and join that and the original table to a new table. 
SELECT id, name, userkey 
INTO NewTable 
FROM Table1 t1 
JOIN #temp t2 
ON t1.SIN = t2.SIN 

SQLFiddle here

+0

这很好,谢谢:)我怎么会再次运行此查询,而无需重新添加所有现成的列。有没有办法更新现有的行,同时还添加新的行? – PsychoDUCK

+1

@PsychoDUCK稍微复杂一点,你需要保存映射表而不是使用temp,否则就没有映射SIN-Guid的使用。看看http://sqlfiddle.com/#!3/7eeb8/1 –

+0

谢谢,这将很好地处理任何新记录,但它看起来不会处理更新。附:我实际上是将表1中的id保存到新表中,以便它们可以映射。我只是把它从我的问题中删除了,因为我试图简化我需要的东西。我的错。我们可以说,我的两个表中的id列是从table1中拉出的相同的id列。 – PsychoDUCK