2013-05-10 2 views
0

3 개의 하위 쿼리로 oracle sql을 작성하지만 시간 초과 문제가 발생합니다. 해결 방법에 대한 기술적 인 도움을 바랍니다. 하위 쿼리로 인해 하위 쿼리가 발생하는 Oracle SQL

select DISTINCT E_reg.applicant_id, 
      E_REG.L_NAME, 
      E_REG.F_NAME, 
      E_REG.B_DATE, 
      E_REG.REG_DATE, 
from  E_REG,TRANSACTION 
where E_REG.ID=TRANSACTION.PAR_ID 
    and  TRANSACTION.BEGIN_DATE BETWEEN to_date ('01-APR-2012')AND to_date('30-JUN-    2012') 
and e_reg.applicant_id NOT IN 
       (select applicant_id 
        from w_reg 
        where reg_date <'01-JUL-2012' 
        and exit_date is NULL or exit_date >='01-APR-2012' 
or e_reg.applicant_id NOT IN 
       (select applicant_id 
        from t_reg 
        where reg_date <'01-JUL-2012' 
        and exit_date is NULL or exit_date>='01-APR-2012') 
or e_reg.applicant_id NOT IN 
       (select applicant_id 
        from r_reg 
        where reg_date <'01-JUL-2012' 
        and o_attend IS NOT NULL 
        and term_date is NULL or term_date >='01-APR-2012') 

은 기본적으로 우리는 당신이 될 수있는 4 개 프로그램이 (t, 승, 전자, 및 R) : 여기 내 쿼리입니다. 그것들은 기본적인 참가자 정보를 저장하는 모든 분리 된 테이블입니다. 동시에 4 개 프로그램 모두에있을 수 있으며, 신청자 ID는 모든 사람의 열쇠가됩니다.

트랜잭션 테이블에는 r 프로그램이 아닌 3 개 또는 4 개의 프로그램에서 수신 할 수있는 서비스가 있으며 자체 트랜잭션 테이블이 있습니다.

시간대에 서비스가 있지만 동시에 다른 프로그램에 서비스가없는 전자 테이블의 참가자 목록을 원합니다. 그들은 전자 프로그램을 통해서만 서비스 될 것입니다. 오늘 아침에 일하는 것처럼 보였지만 시간이 흐르기 시작하고 전혀 돌아 가지 않았습니다. 하위 쿼리 여야합니다. 이 작업을 수행하는 더 좋은 방법이 있는지 궁금합니다.

+1

이 어떤 모양의이 계획을 설명 : 여기에

은 대체 버전인가? SQL 피들을 제공 할 수 있다면 사람들은 더 많은 도움을받을 것입니다. – Woot4Moo

+0

매번 병목이 될 수있는 전체 테이블 스캔을하는 것처럼 보입니다. – Woot4Moo

+0

인덱스를 사용하여 쿼리 실행 계획과 테이블 정의를 게시하고 각 테이블의 행 수 계산을 사용하십시오. –

답변

1

저는 where 절에 문제가 괄호로 묶여 있음을 확신합니다. 조인을 취소하는 or 절이 있습니다. 항상 ANSI 조인 구문을 사용하면이 문제가 발생할 가능성이 크게 줄어 듭니다.

select DISTINCT E_reg.applicant_id, 
      E_REG.L_NAME, 
      E_REG.F_NAME, 
      E_REG.B_DATE, 
      E_REG.REG_DATE, 
from E_REG join 
     TRANSACTION 
     on E_REG.ID=TRANSACTION.PAR_ID 
    where TRANSACTION.BEGIN_DATE BETWEEN to_date ('01-APR-2012')AND to_date('30-JUN-    2012') 
and (e_reg.applicant_id NOT IN 
       (select applicant_id 
        from w_reg 
        where reg_date <'01-JUL-2012' 
        and exit_date is NULL or exit_date >='01-APR-2012' 
or e_reg.applicant_id NOT IN 
       (select applicant_id 
        from t_reg 
        where reg_date <'01-JUL-2012' 
        and exit_date is NULL or exit_date>='01-APR-2012') 
or e_reg.applicant_id NOT IN 
       (select applicant_id 
        from r_reg 
        where reg_date <'01-JUL-2012' 
        and o_attend IS NOT NULL 
        and term_date is NULL or term_date >='01-APR-2012') 
    ) 
+0

"or"을 꺼내 "and"로 바꾸고 조인 구문을 조정했습니다. 감사! – user1466935

관련 문제