0
SELECT
  AI_636.PARENT_ID AS PART,
  MAX(b.AP_1036) AS ESTEND,
  MAX(a.AP_3222) AS ACTEND
FROM
  AI_636
  LEFT OUTER JOIN AI_665 a
    ON
    (
      a.AP_1033 = AI_636.PARENT_ID
      AND SUBSTR(a.AP_1028, 1, 4) >= '2000'
      AND a.AP_1030 NOT IN ('994')
      AND
      (
        a.AP_1033 NOT IN
        (
          SELECT AI_665.AP_1033 FROM AI_665 WHERE AI_665.AP_3222 IS NULL
        )
      )
    )
  JOIN AI_665 b
    ON
    (
      b.AP_1033 = AI_636.PARENT_ID
      AND SUBSTR(b.AP_1028, 1, 4) >= '2000'
    )
  GROUP BY AI_636.PARENT_ID

このクエリは、大きなクエリの一部であり、呼び出し全体の実行が非常に遅くなります。

基本的に、親操作があり、その下にいくつかの子操作があります。操作の推定終了日と実際の終了日は子レベルでのみ保存されるため、親レベルの終了日を導出するために、子レベルで最大の日付を見つけようとしています。私が遭遇する問題は、子操作が完了せず、終了日が NULL であり、MAX() 関数がこれらを無視する場合です。子操作テーブルをそれ自体に結合し、それを絞り込んで、兄弟がすべて非 NULL の終了日を持つ子操作のみを含めることで、これを回避しています。

NULL 以外の終了日を持つ子を持つ親操作の検索を最適化する方法はありますか?

4

2 に答える 2

0

私の最後の答えには間違いがありましたが、これが役立つかもしれません:

AND NOT EXISTS (SELECT NULL
                FROM   AI_665 a2
                WHERE  a2.AP_1033 = a.AP_1033
                AND    a2.AP_3222 IS NULL)
于 2010-12-09T21:15:58.800 に答える