我有一种情况,我需要为一组记录中的每一个添加任意唯一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存储过程中完成。以编程方式执行它没有问题。
答案 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