2013-07-20 3 views
0

Group이라는 테이블과 Entry이라는 테이블이있는 문제가 있습니다. Group 테이블에는 기본 키 Id이 있습니다. Entry 테이블에는 기본 키 Id이 있고 Group 테이블의 Id에 대한 외래 키는 GroupId입니다. Entry 테이블에는 또 하나의 열 Weight이 있습니다. 이 Weight은 정수이며 모두 맨 위에 0이 표시된 정렬 가중치를 말해줍니다.그룹화 된 시리즈의 각 요소에 증분 값을 어떻게 추가 할 수 있습니까?

기본적으로 데이터베이스 설계시 누군가가 Weight 필드를 Null 허용으로 설정했습니다. 이제는 을 UNIQUE 제약 조건에 맞게 조정해야합니다 (UNQIUE(GroupId, Weight)Entry 테이블에 추가). 이렇게하면 두 개의 Entry 항목이 기본적으로 동일한 그룹에 속할 때 동일한 정렬 가중치를 갖지 않습니다.

어떤 쿼리 나 기존 데이터를 모두 통과 단순히 N은 Group에서 Entry 항목의 수는 N 0에서 그룹별로 그룹에있는 각 항목에 Weight 열 번호를 할 것인가? 주어진 Group에서 Entry에 대한 가장 낮은 Id이 가장 낮은 Weight이되도록 의 Id을 기반으로 가중치를 설정하고 싶습니다.

Group 테이블을 통과하는 하나의 큰 '쿼리를 원한다면, 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

그래, 그게 그랬는지 궁금 해서요. 더 많은 조사가 이루어지면 더 많은 의미가 있습니다. –