2010-07-28 3 views
0

이 질문에 대답하는 데 추가 정보가 필요하면 주석을 추가하십시오.데카르트 제품으로 페이징

우리는 카티 젼 곱을 반환하는 쿼리를 가지고 있습니다. 많은 결과가 있기 때문에 잠재적으로 수화물을 얻을 수있는 많은 물체가 있습니다. 데이터베이스의 끝 부분에서 간단한 페이징을하므로 빠른 결과를 얻을 수 있습니다. 따라서 n * 페이지 인 n * 페이지에서 시작하는 n 개의 결과 만 가져옵니다.

우리가 직면 한 문제는 distinct이 필요한 행만 반환하도록 쿼리에서 수행 중입니다. 그러나 이것은 결과를 필터링하여 100보다 작아 지도록 끝납니다.

페이지 번호가 있더라도 시작할 때 또는 시작하지 않고 어디에서 시작하거나 중지해야하는지 알 수 없습니다 포인트 (즉, 우리는 rownum을 사용할 수 없음)를 사용하고 잠재적으로 100 개의 결과가 나올 때까지 루핑 할 수 있습니다. 지저분 해.

필요하다면 SQL을 직접 수행 할 수 있지만 리팩터링과 같은 작업은 옵션이 아닙니다.

어쨌든 나는 우리가 처음으로 상황을 만난다는 것을 상상할 수 없기 때문에 이것을 할 수있는 방법이 있는지 알고 싶습니다.

미리 감사드립니다.

편집 : @ nicolas78은 상황을 정확히 설명하는 의견을 게시했습니다.

+0

나는 당신이하는 일에 대해 모호한 생각을하고 있습니다. 기본적으로 두 개의 매개 변수를 기반으로하고 많은 조합이 버려지기 때문에 결과 집합의 101 번째 행을 처리하는 방법을 알지 못합니다. 만약 그렇다면, 나는 이것을 예측하는 방법을 전혀 모릅니다. (문제는 페이징 하나가 돌아가는 것이 아니라 페이지 5와 같은 것으로 뛰어 오르는 법을 모르는 것입니다.). 이는별로 도움이되지 않습니다. 단지 조건을 명확히하려고 노력합니다. – Nicolas78

+0

네, 바로 그게 문제입니다. 우리가 100 개의 결과를 요구하더라도, 우리가 되돌릴 수있는 것은 67입니다. 페이지 n을 요청할 때 어떤 행을 시작할 지 아무런 생각이 없습니다 –

답변

2

페이지 매김이 적용되기 전에 이 수행되도록 DISTINCT를 쿼리에 추가로 밀어 넣어야합니다. 예 :

select deptno from 
    (select deptno, rownum as rn from 
     (select DISTINCT deptno 
     from emp 
     order by deptno 
    ) 
    where rownum < :pagenum*100 
) 
where rn > (:pagenum-1)*100; 
관련 문제