2013-07-20 2 views
0

У меня возникла проблема, когда у меня есть таблица под названием Group и таблица под названием Entry. Таблица Group имеет первичный ключ Id. Таблица Entry имеет первичный ключ Id, внешний ключ к Group таблице Id под названием GroupId. Таблица Entry имеет еще одну колонку Weight. Это Weight является целым числом, и все, что он делает, это сказать мне вес сортировки, где в верхней части отображается нуль.Как добавить инкрементное число к каждому элементу в сгруппированной серии?

В основном, что произошло, кто-то сделал это Weight поле nullable, когда была создана база данных. Теперь мне нужно пройти и настроить Weight, чтобы соответствовать ограничению UNIQUE, которое мы намерены добавить: UNQIUE(GroupId, Weight) в таблицу Entry. Это не позволяет двум записям Entry иметь тот же вес, если они находятся в одной группе в основном.

Что запрос позволил бы мне пройти через все наши существующие данные и просто сосчитать Weight колонки на каждом из записей на группы по групповой основе от 0 до N, где N является числом Entry записей в Group? Я хочу установить вес на основе IdEntry, так что самый низкий Id для в данном Group получает самое низкое Weight.

Я хочу один большой запрос ol, который пройдет через таблицу Group, объединит все записи Entry, а затем перебирает их и назначает последовательность. Но я не знаю, с чего начать.

+2

[ROW_NUMBER] (http://msdn.microsoft.com/en-us/library/ms186734.aspx) - SQL Server 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

А это помогает так сильно. Спасибо. Я сидел здесь, пытаясь сделать это целую вечность и никогда даже не использовал предложение «ОВЕР». Это очень аккуратно! Это определенно сделало наш тестер счастливым :) –

+0

PARTITION BY является ключевым игроком в этом заявлении, он сбрасывает числа при изменении идентификатора группы. :) – ermagana

+0

Да, мне было интересно, если это так. После дальнейших исследований это имело больше смысла. –

Смежные вопросы