2009-02-13 45 views
4

我有一種情況,我需要爲每組記錄添加一個任意的唯一標識。下面可以更容易地看到它。在記錄組內分配唯一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存儲過程中完成。我在編程方面沒有問題。

+0

您發佈的表格是您想要的還是您擁有的?請發佈兩個:你現在擁有什麼和你想得到什麼。至於現在,它很混亂。 – Quassnoi 2009-02-13 15:52:12

回答

8

假設你使用SQL Server 2005或更好您可以使用ROW_NUMBER()

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

您可以創建一個遊標來讀取所有排序的值,然後在每次更改值時重置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 
0

Hmmmmm,您可以創建,爲了和這組根據您的訂單ID返回行號信息的看法?確保行號始終以相同的順序返回。

無論是或者你可以使用觸發器,並在插入計算訂單的最大ID?

或者你也許可以在插入中使用從max語句選擇?

也許這些都不令人滿意?

0

增加了一條記錄表中,您可以創建動態的 「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, ....) 
0

如果你不使用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