我们有一个使用社会安全号码作为唯一ID的数据库,我希望能够更改它,以便它可以显示唯一的ID,而不依赖于SSN。当我看一下时,有些表并不完全一致。
我能想到的唯一解决方案是我可以通过ssn连接表,但是有一个自动编号唯一ID可以与ssn连接...所以我可以显示自动编号而不是ssn。
为了便于说明:
Table 1:
+ ------ + --------- +
| SSN | FirstName |
+ ------ + --------- +
| 111111 | Jeff |
| 123456 | Kevin |
| 654321 | Mark |
| 555555 | David |
+ ------ + --------- +
Table 2:
+ ------ + ---------- +
| SSN | Address |
+ ------ + ---------- +
| 111111 | California |
| 123456 | Texas |
| 654321 | Arizona |
+ ------ + ---------- +
FakeIDTable:
+ --- + -- +
| SSN | ID |
+ --- + -- +
此查询:
SELECT Table1.FirstName, Table2.Address, FakeIDTable.ID
FROM (Table1 INNER JOIN Table2 ON Table1.SSN = Table2.SSN)
LEFT JOIN FakeIDTable ON Table1.SSN = FakeIDTable.SSN;
给出了这个结果:
+ --------- + ---------- + -- +
| FirstName | Address | ID |
+ --------- + ---------- + -- +
| Jeff | California | |
| Kevin | Texas | |
| Mark | Arizona | |
+ --------- + ---------- + -- |
是否可以使用Sql使用自动编号填充FakeIDTable.ID?
Update Query1
Set Query1.ID = (autonumber)
或类似的东西?
答案 0 :(得分:2)
您可以将identity()
property属性的列添加到表ssn
对该表唯一且包含所有引用的ssn
的表中,或创建一个具有唯一性的表ssn
和id
,或使用row_number()
对某些行进行编号:
将identity
列添加到没有identity
列的现有表格中:
alter table t
add Id int not null identity(1,1);
使用identity
列创建假表:
create table faketable (
id int not null identity(1,1) primary key
, ssn int not null unique
);
insert into faketable (ssn)
select distinct ssn
from t;
使用common table expression使用row_number()
更新非身份ID:
;with cte as (
select *
, rn = row_number() over (order by ssn)
from t
)
update cte
set Id = rn;
使用子查询中的row_number()
更新非身份标识:
update sub
set Id = rn
from (
select *
, rn = row_number() over (order by ssn)
from t
) as sub
rextester演示:http://rextester.com/TDDA51123