2

システムのスローダウンを解消するために改善しようとしている SQL がいくつかありますが、この質問のすべてのステートメントを追加するには多すぎます。

PL/SQL の一部には、 AND Not Exists句を含むAND Exists句があります。

これらの節には両方ともCaseステートメントが含まれています。case ステートメントのEnd部分の後に、 IS NOT NULLまたはIS NULLステートメントがあります。数年間 PL/SQL を使用してきましたが、この構文を見たのはこれが初めてであり、理解していないことを率直に認めます。AND Exists節全体を以下に示します。助けていただければ幸いです。

AND EXISTS  (
  SELECT Distinct PROJECTID
  From Milestone_History MH, 
       Project_Milestone PM
  Where MH.MilestoneId = PM.ID
    AND MH.Projectid = PR.ID
    AND ((UPPER(PM.Description) = 'FINAL BUILD INVOICE INSTRUCTIONS ISSUED') OR
         (UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED') OR
         (UPPER(PM.Description) = 'PROJECT COMPLETE'))
     AND (case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' then
                  Actual
                End IS NOT NULL 

                AND 
                  case
                    when UPPER(PM.Description) = 'PROJECT COMPLETE' then
                      MH.Actual
                  end IS NULL)
           AND NOT EXISTS
         (SELECT Distinct MH2.ProjectID
          From Milestone_History MH2, Project_Milestone PM2
          Where MH2.MilestoneId = PM2.ID
            And MH2.ProjectID = MH.ProjectID
            AND case
                    when UPPER(PM2.Description) = 'PROJECT COMPLETE' then  -
                          MH2.Actual
                    end IS NOT NULL))
4

2 に答える 2

2

最初の 2 つの条件:

 Where MH.MilestoneId = PM.ID
   AND MH.Projectid = PR.ID

- サブクエリで 2 つのテーブルを結合し、サブクエリをメイン クエリに結合します。

次の 3 つの条件:

AND (UPPER(PM.Description) = 'FINAL BUILD INVOICE INSTRUCTIONS ISSUED' OR
     UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' OR
     UPPER(PM.Description) = 'PROJECT COMPLETE')

- Description3 つの値のいずれかであることを確認します。

ただし、次の条件:

AND case when UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' 
         then Actual End IS NOT NULL 

- それ自体は問題ありませんが、前の 3 つの条件のうちの 2 つに矛盾しています。として記述された式CASE WHEN condition THEN value END IS NOT NULLは、本質的真でconditionなければならず (そうでない場合、CASE 句は NULL として評価されます) その値は NULL であってはなりません。次のように書き換えることができます。

AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' 
AND Actual IS NOT NULL 

- これはより明確で簡潔です (そして、前の括弧で囲まれた句から 3 つの条件のうち 2 つを除外します)。

次の条件:

AND case when UPPER(PM.Description) = 'PROJECT COMPLETE' 
         then MH.Actual end IS NULL

- (再び) それ自体は問題ありませんが、以前の状態のために本質的に冗長です。次のように書き換えることができます。

AND (UPPER(PM.Description) <> 'PROJECT COMPLETE' OR MH.Actual IS NULL)

- 繰り返しますが、より明確で簡潔です。前の条件により常に true になることがUPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED'保証されるため、これも不要です。UPPER(PM.Description) <> 'PROJECT COMPLETE'

句は、単に-に変更する だけで、句の外側NOT EXISTSのメイン クエリの最後に別の句として含めることができます。句の真です。EXISTSAnd MH2.ProjectID = MH.ProjectIDAnd MH2.ProjectID = PR.ProjectIDNOT EXISTSEXISTSEXISTS

前の IS NOT NULL 条件と同様に、式は次のとおりです。

  AND case when UPPER(PM2.Description) = 'PROJECT COMPLETE' 
           then MH2.Actual end IS NOT NULL

- 次のように書き換えることができます。

  AND UPPER(PM2.Description) = 'PROJECT COMPLETE' 
  AND MH2.Actual IS NOT NULL

したがって、節全体は次のように書き直すことができます。

AND EXISTS 
(SELECT Distinct PROJECTID
 From Milestone_History MH, Project_Milestone PM
 Where MH.MilestoneId = PM.ID
   AND MH.Projectid = PR.ID
   AND UPPER(PM.Description) = 'FEASIBILITY STUDY REQUIRED' 
   AND Actual IS NOT NULL 
   AND NOT EXISTS
   (SELECT Distinct MH2.ProjectID
    From Milestone_History MH2, Project_Milestone PM2
    Where MH2.MilestoneId = PM2.ID
      AND UPPER(PM2.Description) = 'PROJECT COMPLETE' 
      AND MH2.Actual IS NOT NULL
   )
)
于 2013-05-14T17:08:39.647 に答える