2014-09-05 3 views
1

우리는 데이터베이스에 많은 데이터를 가지고 있으며 때때로 IN 절에 1000 개가 넘는 항목이있는 SQL 문을 호출해야합니다. 나는 그 SQL 문을 리팩토링해야하고 IN 절에 많은 항목이 있으면 안되지만 때로는 각 SQL 쿼리를주의 깊게 관찰하는 것이 쉽지 않다는 것을 알고 있습니다. 그래서 몇 가지 질문이 있습니다.HSQLDB/Oracle - IN 절에 1000 개가 넘는 항목

  1. 이 문제를 해결할 수있는 방법은 무엇입니까? 나는 몇 가지 발견 -이 ... IN (SELECT id from temptable) 모양을 절 그렇게
  2. 이 항목에 대한 임시 테이블을 만들
  3. 항상 쉬운 일이 아니다 -
    • 리팩토링의 SQL 문을 ... id IN (...) or id IN (...) 같은 몇 IN 조항에 좋은 생각을
    • 분할 IN 절을 수 있습니다
  4. 오라클 DB는 IN 절에 대한 제한이 있지만 단위 테스트에 사용하는 HSQLDB에 대한 제한을 찾지 못했습니다. HSQLDB에서 어떤 설정이나 다른 방법으로이 제한을 설정할 수 있습니까?
  5. IN 절의 임시 테이블에 관해서 - HQL을 사용하여 임시 테이블을 생성하는 방법 (우리는 우리의 응용 프로그램에서 Hibernate 4.2를 사용한다)? 가능한가?
  6. 현재 데이터베이스에 많은 데이터가 없기 때문에 IN 개의 항목은 1000 개가 넘습니다. 그러나 응용 프로그램을 프로덕션 환경에서 시작한 후에도 (여전히 개발 프로세스 중입니다) 더 많은 데이터가 있으므로이를 준비해야합니다.

이 문제에 대한 경험은 무엇입니까? 어떻게 해결 했니? 우리의 환경에 대한

세부 사항 :

  • 최대 절전 모드 4.2
  • 는 HSQLDB 2.3.2
  • 오라클 11g
+0

(단위) 테스트를 위해 다른 DBMS를 사용하는 것이 좋지 않은 또 다른 좋은 예 –

답변

0

내가 여기 질문 1은 이미 많이 대답하고있다 생각하지만,이 링크입니다 우아한 솔루션으로 Oracle Community에서

기본적으로 쉼표로 구분 된 문자열을 테이블로 변환하는 테이블 형식과 함수를 만듭니다. 이렇게하면 반환 된 테이블 데이터에 조인 할 수 있습니다.

create or replace function in_number_list (in_list in varchar2) --send string 
return num_table          --return table of numbers 
as 
l_tab num_table := num_table();   -- blank table 
l_text varchar2(32767) := in_list || ','; -- passed string + extra ',' 
l_idx number;        -- a counter 

begin 
loop 
    l_idx := instr(l_text, ',');    -- find the first comma position 
    exit when nvl(l_idx,0) = 0;    -- if no more, break out of loop 
    l_tab.extend;        -- add a new row to table 
    l_tab(l_tab.last) := to_number(trim(substr(l_text,1,l_idx-1))); 
             -- add entry to table based on number 
             -- split from string 
    l_text := substr(l_text,l_idx+1);   -- reset the original string 
             -- trimming off what we've processed 
end loop; 
return l_tab;        -- send back table of numbers 
end; 
0

가 다시 질문 2, HSQLDB은 IN 절에있는 항목의 수에 제한을 두지 않고 제한이 부과 될 수 없다 : 우리가 번호/ID의 쉼표로 구분 된 목록 구현 방법은 다음과

입니다 .

관련 문제