0

用 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 个程序可供您使用(e、w、t 和 r)。这些都是包含基本参与者信息的单独表格。您可能同时在所有 4 个程序中,申请者 ID 将是每个人的关键。

事务表包含您可能在这 3 个或 4 个程序中收到的任何服务,而不是 r 程序,它有自己的事务表。

我想要在 e 表中列出在时间范围内有服务但同时在任何其他程序中没有任何服务的参与者列表。他们只能通过 e 程序获得服务。今天早上它似乎工作了,但是它开始超时并且根本没有运行。我认为它必须是子查询。想知道是否有更好的方法来完成这项工作。

4

1 回答 1

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')
   )
于 2013-05-10T18:52:24.233 回答