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
这个查询只是一个较大查询的一小部分,它会导致整个调用的执行速度非常慢。
基本上,有一个父操作,然后在它下面有几个子操作。操作的估计结束日期与实际结束日期仅存储在子级,因此要为父级派生一个,我尝试在子级找到最大的日期。我遇到的问题是当子操作没有完成时,它的结束日期为空,MAX()函数会忽略这些日期。为了解决这个问题,我将子操作表与其自身连接起来,并将其范围缩小到只包含兄弟操作都具有非空结束日期的子操作。
有没有什么方法可以优化带有非空结束日期的子操作的父操作的搜索?
发布于 2010-12-10 05:15:59
我的上一个答案有一个错误,但这可能会有所帮助:
AND NOT EXISTS (SELECT NULL
FROM AI_665 a2
WHERE a2.AP_1033 = a.AP_1033
AND a2.AP_3222 IS NULL)
发布于 2013-04-26 22:05:04
您必须创建一个降序索引来加快MAX()
https://stackoverflow.com/questions/4403134
复制相似问题