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 回答
0

您必须创建一个降序索引以加快 MAX()

于 2013-04-26T14:05:03.830 回答