2013-07-20 39 views
0

我面臨一個問題,我有一個名爲Group的表格和一個名爲Entry的表格。 Group表具有主鍵IdEntry表具有主鍵IdGroup表的Id的外鍵被稱爲GroupIdEntry表還有一列Weight。這Weight是一個整數,它所做的就是告訴我排序權重,其中0顯示在頂部。如何將增量編號添加到分組系列中的每個元素?

基本上發生的是,有人在設計數據庫時使這個Weight字段爲空。現在我需要通過並調整Weight以適應我們打算添加的UNIQUE約束:UNQIUE(GroupId, Weight)Entry表。這可以防止兩個Entry條目在基本處於同一組時具有相同的排序權重。

什麼查詢將讓我去通過我們現有的數據和簡單的數對每個條目上逐組基礎和N的Weight列從0其中N爲Entry條目在Group多少?我想根據EntryId設置權重,以便給定Group中的Entry的最低Id得到最低Weight

我想要一個將通過Group表的大ol查詢,加入所有Entry條目,然後遍歷它們並分配序列。但是,我不知道從哪裏開始。

+2

[ROW_NUMBER(http://msdn.microsoft.com/en-us/library/ms186734.aspx) - SQL服務器2005+ –

回答

1

基本上你會用MS SQL Over Clause

這裏是一個sqlfiddle sample to show you how to do it in one query

希望這有助於。

CREATE TABLE Entry (Id INT PRIMARY KEY, GroupId INT, Weight INT); 

CREATE TABLE [Group] (Id INT PRIMARY KEY, Label VARCHAR(10)); 

INSERT [Group] (Id, Label) 
VALUES(1, 'test'); 


INSERT Entry (Id, GroupId, Weight) 
VALUES(1,1, null) 

INSERT Entry (Id, GroupId, Weight) 
VALUES(2,1, null) 

INSERT Entry (Id, GroupId, Weight) 
VALUES(3,1, null) 

UPDATE E 
    SET E.WEIGHT = o.WEIGHTIS 
--SELECT * 
FROM Entry E 
INNER JOIN (
    SELECT G.Id GID, E.Id EID, 
    ROW_NUMBER() OVER(PARTITION BY G.Id ORDER BY E.ID) WeightIs 
    FROM [Group] G 
    INNER JOIN Entry E 
     ON G.Id = E.GroupId 
) o 
ON o.GID = E.GroupID AND o.EID = E.Id 
+0

啊,這有助於使非常多。謝謝。我一直在這裏試圖這麼做,甚至從未使用過「OVER」條款。這真的很乾淨!它絕對讓我們的測試者高興:) –

+0

PARTITION BY是這個聲明中的關鍵角色,它在組ID改變時重置數字。 :) – ermagana

+0

是的,我想知道它是否做到了。經過進一步研究,它更有意義。 –

相關問題