2016-08-24 1 views
0

중복 행을오라클/엑사 ROWNUM 범위를 반환 내가 자바 프로그램의 for 루프에서 엑사에서이 쿼리를 실행하고

다음
select a, b, c, d from (
     select rownum r, a, b, c, d from foo order by c asc 
) where r >= 40001 and r < 50001 

내가 숫자를 반복 다음 루프에서, 그래서 10000에 의해 숫자를 증가 계속 50001 및 60001이 될 것입니다.

나는 행을 가져 와서 다른 데이터베이스에 삽입하고 다시 반복합니다. 내 소스 (엑사) 데이터베이스를 검사 할 때

현재, 내 코드가 A = 23 만 1 행이고 B = [email protected],

Exception in thread "main" java.sql.BatchUpdateException: Duplicate entry '[email protected]' for key 'PRIMARY' 
    at com.mysql.jdbc.PreparedStatement.executeBatchSerially(PreparedStatement.java:1809) 
    at 

같은 임의 오류가 발생. 따라서 원본에는 중복이 없습니다.

대상 데이터베이스를 검사 할 때 행 a = 23, b = [email protected]이 이미 이전 루프 반복에 삽입 된 것을 볼 수 있습니다. {{나는 프로그램 시작시 대상 테이블을 다시 만들고 다시 만듭니다.}}

그래서 내 창 쿼리가 같은 행을 반복해서 반환하는 것처럼 보입니다.

나는 검색을 많이했고, 내 윈도우 쿼리가 중복을 반환하지 것을 확신합니다 ...하지만이

않는 것처럼 나는 그렇게 알려 ... 오라클/엑사 전문가가 아니다 보인다 위의 쿼리가 다른 rownum 범위로 실행할 때 같은 행을 반환 할 수있는 변경 사항이있는 경우

+2

또는 정렬 열에 대한 업데이트. –

답변

1

실제로는 창 기능 인 row_number() over()을 사용하십시오. ab은 레코드를 고유하게 만드는 것처럼 보이므로 시도해야합니다.

select a, b, c, d 
    from (
     select row_number() over (order by a,b) as r, 
       a, b, c, d 
      from foo 
     ) 
    where r >= 40001 
     and r < 50001; 

추신 :이 방법으로로드하는 동안 모든 DML의 소스를 통해 표가 안 있음을 유의하십시오. PS2 : rownum은 주문하기 전에 할당되기 때문에 절대로 작동하지 않습니다. More info.

+0

네, row_number()는 윈도우 함수입니다. rownum 아니요 – vercelli

+0

DML에도 삽입 및 삭제가 포함됩니다. 주문의 첫 번째 위치에있는 새 행이있는 경우 중복을 갖게됩니다. 이미 전송 된 행에 삭제가 있으면 다른 행이 누락됩니다. – vercelli

관련 문제