如何基于行创建标识字段

时间:2013-06-17 11:19:55

标签: sql sql-server sql-server-2005

使用SQL Server 2005

表1

Code ID (identity field)

001 1
001 2
002 1
003 1
003 2

如何根据代码创建身份字段。

需要查询帮助

5 个答案:

答案 0 :(得分:2)

就像这样:

ALTER TABLE dbo.YourTable
ADD NewColumn INT IDENTITY(1,1) 

您可以将seed(起始值)定义为第一个参数,将step(增量)定义为第二个参数 - 因此选择对您有意义的内容; seed = 1和step = 1似乎是最常用的默认值。

该列将在其创建时添加并填充值。

答案 1 :(得分:2)

您似乎希望实施row_number(),这会根据您拥有的id值的数量增加code值:

select code, id
from
(
  select code, 
    row_number() over(partition by code order by code) id
  from yourtable
) d;

使用row_number()可以在查询表格中的数据时计算值。请参阅SQL Fiddle with Demo

如果您想使用此值更新表格,则可以使用以下内容:

;with cte as
(
  select code, id, 
    row_number() over(partition by code order by code) rn
  from yourtable
) 
update cte
set id = rn;

Demo

如果您继续为每个code添加新行,则很难维护在表中存储此值,在查询数据时可能更容易实现row_number()

答案 2 :(得分:0)

(在重新阅读您的问题时,我发现您的id列不是唯一的,因此它不能是标识列。)

要创建使用Code列中的初始值的标识字段,您可以:

-- Create an empty copy of your table
select  top 0 *
into    CopiedTable
from    YourTable;

-- Add an identity column
alter table CopiedTable add id int identity;

-- Copy the rows over, while initializing the identity column from Code
set identity_insert dbo.CopiedTable on

insert  dbo.CopiedTable
        (id, Code)
select  Code
,       Code
from    dbo.YourTable;

set identity_insert dbo.CopiedTable off

-- Drop the old table
drop table dbo.YourTable

-- Rename the copied table
exec sp_rename 'CopiedTable', 'YourTable'

答案 3 :(得分:0)

使用ROW_NUMBER

SELECT
  code, 
  ROW_NUMBER() OVER(PARTITION BY code ORDER BY code) AS ID
FROM Table1

答案 4 :(得分:-1)

count

获取
DECLARE @ID int = (
    SELECT COUNT(*) + 1 from test_1 WHERE [Code] = @CODE )