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 () игнорирует их. Я могу обойти это, присоединив дочернюю таблицу операций к себе и сузив ее так, чтобы она включала только дочерние операции, у братьев и сестер которых есть не конечные даты окончания.
Можно ли как-нибудь оптимизировать поиск родительских операций с дочерними элементами с не конечными датами окончания?