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?
GROUP BY
- person OMG Ponies   schedule 10.12.2010