2013-07-20 38 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

是的,我想知道它是否做到了。经过进一步研究,它更有意义。 –

相关问题