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 つのプログラムすべてに参加している可能性があります。applicant_id が全員のキーになります。

トランザクション テーブルには、独自のトランザクション テーブルを持つ r プログラムではなく、その 3 つまたは 4 つのプログラムで受け取る可能性のあるサービスが格納されます。

時間枠にサービスがあったが、同時に他のどのプログラムにもサービスがなかった 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 に答える