在记录组内分配唯一ID
问题描述:
我有一种情况,我需要为每组记录添加一个任意的唯一标识。下面可以更容易地看到它。在记录组内分配唯一ID
编辑了11:26 est: 目前lineNum字段有垃圾。这是在sql server 2000上运行的。下面的示例是结果应该是什么样子,但实际值并不重要,只要两个组合字段可用于唯一键,数字就可以是任何值。
OrderID lineNum
AAA 1
AAA 2
AAA 3
BBB 1
CCC 1
CCC 2
行号的值不重要,但该字段只有4个字符。这需要通过在sql server存储过程中完成。我在编程方面没有问题。
答
假设你使用SQL Server 2005或更好您可以使用ROW_NUMBER()
select orderId,
row_number() over(PARTITION BY orderId ORDER BY orderId) as lineNum
from Order
答
您可以创建一个游标来读取所有排序的值,然后在每次更改值时重置1,然后每次增加一次。
例如为:
AAA reset 1
AAA set 1 + 1 = 2
AAA set 2 + 1 = 3
BBB reset 1
CCC reset 1
CCC set 1 + 1 = 1
答
Hmmmmm,您可以创建,为了和这组根据您的订单ID返回行号信息的看法?确保行号始终以相同的顺序返回。
无论是或者你可以使用触发器,并在插入计算订单的最大ID?
或者你也许可以在插入中使用从max语句选择?
也许这些都不令人满意?
答
增加了一条记录表中,您可以创建动态的 “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, ....)
答
如果你不使用SQL 2005这是一个稍微基于集合的方式来做到这一点(我不喜欢临时表很多,但我喜欢的光标升ess):
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
您发布的表格是您想要的还是您拥有的?请发布两个:你现在拥有什么和你想得到什么。至于现在,它很混乱。 – Quassnoi 2009-02-13 15:52:12