2015-02-03 4 views
1

행에 대한 참고가있을 때 증분 인덱스를 가져 오려고합니다. ROW_Number() 함께 동일한 얻으려고 노력하고 있지만 그것을 생성하는 데 사용되는 메서드에 문제가있는 것 같습니다. 예상특정 행에 대한 증분 인덱스 가져 오기

SELECT *     RowNo, 
     (SELECT CASE 
       WHEN LEN(Value) > 0 THEN ROW_NUMBER() 
              OVER (
               ORDER BY ID) 
       ELSE '' 
       END 
     FROM Dictionary 
     WHERE ID = ABC.ID) Note 
FROM ABCD AS ABC WITH(NOLOCK) 
     INNER JOIN XYZ AS XYZ WITH(NOLOCK) 
       ON ABC.Id = XYZ.ID 
WHERE ABC.Id = 10 

출력 :

ID Name Note 
    1 A 1 
    2 B  
    3 C 2 
    4 D  
    5 E  
    6 F 3 

답변

3

하위 쿼리가 여기에 필요하고 values이 값이없는 것과 len(value)>0 가진 분리하기 위해 partition by 인수를 사용하지된다

SELECT 
    ID, 
    Name, 
    CASE WHEN LEN(Value)>0 THEN ROW_NUMBER() OVER (
     PARTITION BY CASE WHEN LEN(Value)>0 THEN 1 ELSE 0 END 
     ORDER BY ID) ELSE '' END as Note  
FROM ABCD AS ABC WITH(NOLOCK) 
    INNER JOIN XYZ AS XYZ WITH(NOLOCK) 
     ON ABC.Id = XYZ.ID 
Where ABC.Id = 10 
+0

'CASE ... integer_expression ELSE ''END'는 암시 적으로 ''를 'int'로 변환하여 0이됩니다. –

+1

좋은 캐치. 이것은 OP의 코드이므로 입력을 기다릴 것입니다. 그는 0을 허용하거나, else를 제거하고, null을 허용하거나, row_number를 varchar로 변환하여 빈칸을 가질 수 있습니다. –

2

나는 당신이 사전은 "기본"쿼리를 조회 할 수있는 방법을 변경해야 어쩌면 생각합니다. 테이블이 어떻게 생겼는지 모른 채 말하기는 어렵습니다. 어떤 테이블에서 예상 결과의 "Id"가 나옵니까? 이 같은

시도 :

WITH cte AS (
    SELECT ID, ROW_NUMBER() OVER (ORDER BY ID) AS Note 
    FROM Dictionary WHERE ID=10 
    AND LEN(Value)>0 
) 
SELECT ABC.ID, [Name], cte.Note 
FROM ABCD AS ABC WITH(NOLOCK) 
INNER JOIN XYZ AS XYZ WITH(NOLOCK) ON ABC.Id = XYZ.ID 
LEFT OUTER JOIN cte ON ABC.Id=cte.ID 
+0

같으면를 ' 'RIGHT OUTER JOIN'은'cte '와 일치하지 않는'ABC'와'XYZ' 테이블의 값을 제외합니까? 나는 당신이 '왼쪽 외부 조인'이 'cte'와 일치하지 않는 레코드를 제외하지 않기를 바란다고 생각합니다. –

+0

흠, 예, 원래는 ... 아 마음에 쏙 들지 않았습니다. 편집하겠습니다. –