2013-05-10 5 views
0

Запись оракула sql с 3 подзапросами, однако это вызывает проблему с таймаутом. Надеемся на техническую помощь в получении исправления. Вот мой запрос: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 программы, которые вы можете быть в (е, ж, т, г). Это все отдельные таблицы, содержащие основную информацию участника. Вы можете быть одновременно во всех четырех программах, претендент - это ключ для всех.

В таблице транзакций есть любая услуга, которую вы можете получить в этих 3 или 4 программах, а не в программе r, которая имеет свою собственную таблицу транзакций.

Я хочу, чтобы список участников таблицы e имел сервис в таймфрейме, но не имел никаких сервисов ни в одной из других программ одновременно. Они будут обслуживаться только по электронной программе. Казалось, это работало сегодня утром, но потом это начало отсчета времени и не работает вообще. Я полагаю, что это должен быть подзапрос. Подумайте, есть ли лучший способ сделать эту работу.

+1

и объяснить план это выглядит как что? Если вы можете предоставить скрипт SQL, люди будут более склонны помогать. – Woot4Moo

+0

Похоже, что он выполняет полное сканирование таблицы каждый раз, что может быть шеей бутылки. – Woot4Moo

+0

, пожалуйста, опубликуйте план выполнения запроса и определения таблиц с индексами и предпочтительно с оценками подсчета строк для каждой таблицы. –

ответ

1

Я уверен, что проблема заключается в круглых скобках в вашем предложении where. У вас есть предложения or, которые отменяют соединение. Если вы всегда используете синтаксис ANSI join, вы значительно уменьшите вероятность этого.

Вот альтернативная версия:

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

Я вынул «или» и заменил «и» и скорректировал синтаксис соединения. Благодаря! – user1466935

Смежные вопросы