2013-12-18 2 views
0

나는 거의 내가 원하는 것을 만드는이 쿼리가 있습니다TSQL있는 OrderBy 오프셋 문제

SELECT D.Id from MtdMdl_HierarchicalObject D 
where D.Name LIKE '%R%' 
:

SET NOCOUNT ON 

SELECT D.Id from MtdMdl_HierarchicalObject D 
where D.Name LIKE '%R%' 

SELECT B.* FROM MtdMdl_Item A 
OUTER apply (SELECT * FROM MtdMdl_Item as C where a.Id=c.Id) as B 
WHERE A.Owner in 
(
    SELECT D.Id from MtdMdl_HierarchicalObject D 
    where D.Name LIKE '%R%' 
) 
order by Id offset 0 ROWS FETCH NEXT 3 ROWS ONLY 
GO 

불행하게도 나는 3 행에 의해 반환 된 각 개체에 적용 할 ID로 주문하기 새로운 가져 오기를 원하는을

현재 스크립트는 이전 명령문의 전체 결과에 페이징을 적용하기 때문에.

답변

1

행을 건너 뛰지 않고 그냥 3 행을 얻는다면 왜 오프셋을 사용하여 귀찮을까요? 다만 영업 이익은 병이 같은를 돌려 각 DB 왕복 최고를 가하고, 간단한 새 3 개 행을 원하는 것 같아요 ... 당신이 이런 일을 할 수이 경우

SELECT * FROM 
(
SELECT B.*, A.ID , RN = ROW_NUMBER() OVER (PARTITION BY A.ID ORDER BY A.ID) 
FROM MtdMdl_Item A OUTER APPLY 
        (SELECT * 
        FROM MtdMdl_Item 
         where Id= a.Id) as B 
WHERE A.Owner in 
(
    SELECT D.Id from MtdMdl_HierarchicalObject D 
    where D.Name LIKE '%R%' 
) 
order by Id 
) Q 
WHERE RN >= LowerList AND RN <= UpperLimit 
+0

을 TOP 절

SELECT B.* FROM MtdMdl_Item A OUTER APPLY (SELECT TOP 3 * FROM MtdMdl_Item where Id= a.Id) as B WHERE A.Owner in ( SELECT D.Id from MtdMdl_HierarchicalObject D where D.Name LIKE '%R%' ) order by Id 

를 사용하여 3 행. 내 추측이 맞으면 OP에서 StartFromRow_N 매개 변수를 유지하고 쿼리에 전달해야합니다. – jean

+0

@jean ID OFFSET 0은 OP가 모든 행을 건너 뛰지 않음을 의미합니다. 그래서 OFFSET보다는 TOP 절을 사용하는 것이 더 합리적입니다. –

+0

그것은 내 잘못입니다.이 경우 오프셋에 0이 있지만 실제 의도는 페이징을 사용하는 것이므로 null이 아닌 오프셋을 가질 수 있습니다. – Nock