2016-12-16 2 views
0
나는 다음과 같은 쿼리 코드를하려고 문제에 직면하고있다

에서 DISTINCT : 1000 개 결과를 쿼리를 반복하고 검색, 내가 페이지를 위해 자바 코드의 조각 과정을을에 사용ROWNUM 및 오라클

SELECT id, 
     contractnumber, 
     partyid, 
     entity, 
     product, 
     fecha 
FROM (
    SELECT DISTINCT (contractdet.id), 
     contractdet.contractnumber, 
     contractdet.partyid, 
     contractdet.entity, 
     contractdet.product, 
     contractdet.fecha, 
     ROWNUM AS rnumber 
    FROM contractdet 
    INNER JOIN contractcust ON contractcust.contractdet_id = contractdet.id 
    INNER JOIN customerdet ON customerdet.partyid = contractdet.partyid 
    WHERE TO_CHAR(contractdet.fecha, 'YYYYMM') <= TO_CHAR(ADD_MONTHS(TO_DATE(20160828, 'YYYYMMDD'), -3), 'YYYYMM') 
    AND contractdet.product = 'TC' 
    ORDER BY contractdet.id ASC 
) 
WHERE rnumber BETWEEN ? AND ? 
ORDER BY id 

을 매번. 내가 가지고있는 주요 문제는 DISTINCT 명령은 내가 수행 한 모든 쿼리의 결과를 혼합 할 때 중복 된 행을 검색 할 수 있도록 전체 결과 집합이 아니라 내가 속한 간격에만 적용된다는 것입니다.

+0

쿼리의 형식을 지정하기 위해 노력하십시오. –

+6

'DISTINCT'는 *** 함수가 아닙니다 ***. 검색어의 ** 모든 ** 항목에는 항상 적용됩니다. –

+2

또한 :'TO_DATE (20160828, ..)'이 잘못되었습니다. 'to_date()'는 숫자가 아닌 문자열 ('varchar')을 기대하며'to_date()'가 필요 없습니다. 표현식은'ADD_MONTHS (DATE '2016-08-28', -3)' –

답변

0

자바로 SQL에서 CTE를 사용할 수 있습니까?

with distinctRecords as (
    select distinct myCol, rownum rnum 
    from myTable 
    order by myCol 
) 
select * 
from distinctRecords 
where rnum between ? and ?; 
+0

사실, 인라인보기를 사용할 때 OP가 수행하는 작업. with 절 또는 from 절에서 하위 쿼리를 선언하는지 여부에 관계없이 여전히 하위 쿼리 (및 rownum의 존재로 인해 중첩 될 수없는 하위 쿼리)입니다. – Boneist

0

당신은 같은 것을 할 수 있습니다 :

with t as (
     <your subquery here without the `distinct`> 
    ) 
select t.* 
from (select t.*, 
      row_number() over (partition by id order by id) as seqnum 
     from t 
    ) t 
where seqnum = 1; 

id 당 하나 개의 임의의 행을 선택합니다 여기

은 예입니다. 하위 쿼리에서 order by을 변경하여 선택한 행 (예 : 가장 오래된 행 또는 가장 최신 행)을 제어 할 수 있습니다.