如何使用sql中的查询将表的字段设置为自动编号

时间:2017-03-10 16:40:06

标签: sql sql-server

我们有一个使用社会安全号码作为唯一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)

或类似的东西?

1 个答案:

答案 0 :(得分:2)

您可以将identity() property属性的列添加到表ssn对该表唯一且包含所有引用的ssn的表中,或创建一个具有唯一性的表ssnid,或使用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