0

我面临一个问题,我有一个名为的表Group和一个名为 的表Entry。该Group表有一个主键Id。该Entry表有一个主键,一个表的Id外键被调用。该表还有一列。这是一个整数,它所做的只是告诉我顶部显示零的排序权重。GroupIdGroupIdEntryWeightWeight

基本上发生的事情是,有人在Weight设计数据库时使该字段为空。现在我需要通过并调整Weight以适应UNIQUE我们打算添加的约束:UNQIUE(GroupId, Weight)Entry表中。这基本上可以防止两个Entry条目在同一组中时具有相同的排序权重。

什么查询可以让我浏览所有现有数据,并简单地将Weight每个条目上的列从 0 到 N 逐组编号,其中 N 是 a 中的Entry条目数Group?我想根据 的 设置权重IdEntry以便给定中的最低Id者获得最低的。EntryGroupWeight

我想要一个大的查询,它将遍历Group表,连接所有Entry条目,然后遍历它们并分配序列。但是,我不知道从哪里开始。

4

1 回答 1

1

本质上你会使用MS SQL Over Clause

这是一个sqlfiddle 示例,向您展示如何在一个查询中执行此操作

希望这可以帮助。

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
于 2013-07-20T04:29:05.130 回答