在记录组中分配唯一ID

时间:2009-02-13 15:44:30

标签: sql-server stored-procedures

我有一种情况,我需要为一组记录中的每一个添加任意唯一ID。下面更容易想象这一点。

编辑11:26 est: 目前lineNum字段有垃圾。这是在sql server 2000上运行的。下面的示例是结果应该是什么样子但实际值并不重要,只要两个组合字段可以用于唯一键,数字就可以是任何东西。

OrderID      lineNum
AAA          1
AAA          2
AAA          3
BBB          1
CCC          1
CCC          2

行num的值并不重要,但字段只有4个字符。这需要在sql server存储过程中完成。以编程方式执行它没有问题。

5 个答案:

答案 0 :(得分:8)

假设您使用的是SQL Server 2005或更高版本,则可以使用Row_Number()

select orderId,
       row_number() over(PARTITION BY orderId ORDER BY orderId) as lineNum
from Order

答案 1 :(得分:1)

在向表格添加记录时,您可以动态创建“linenum”字段:

在Transact-SQL中,类似这样:

Declare @lineNum AS INT

-- Get next linenum
SELECT @lineNum = MAX(COALESCE(linenum, 0)) FROM Orders WHERE OrderID = @OrderID
SET @lineNum = @lineNum + 1

INSERT INTO ORDERS (OrderID, linenum, .....)
VALUES (@OrderID, @lineNum, ....)

答案 2 :(得分:0)

您可以创建一个游标,读取所有已排序的值,然后在每次更改值时重置1,然后逐步递增每次。

E.g:

AAA reset 1
AAA set 1 + 1 = 2
AAA set 2 + 1 = 3
BBB reset 1
CCC reset 1
CCC set 1 + 1 = 1

答案 3 :(得分:0)

嗯,您能否创建一个视图,按顺序返回行号信息并根据您的订单ID对其进行分组?确保行号始终以相同的顺序返回。

或者您可以使用触发器并在插入上计算订单的最大ID?

或许您可以在插入时使用select from max语句?

也许这些都不令人满意?

答案 4 :(得分:0)

如果你没有使用SQL 2005,这是一个稍微基于集合的方法(我不喜欢临时表,但我更喜欢游标):

declare @out table (id tinyint identity(1,1), orderid char(4))

insert @out select orderid from THESOURCETABLE

select 
    o.orderid, o.id - omin.minid + 1 as linenum
from @out o
    inner join
        (select orderid, min(id) minid  from @out group by orderid) as omin on
            o.orderid = omin.orderid