Вы можете сделать что-то подобное, чтобы избежать повторного нажатия на таблицу SOFTWARE_DEVELOPMENT_CYCLE
SELECT vendor,
name,
language,
version,
status,
sof_dc_id
FROM (SELECT SOF.VENDOR,
SOF.NAME,
LAN.LANGUAGE,
SOF.VERSION,
SDC.STATUS,
SDC.SOF_DC_ID,
RANK() OVER (PARTITION BY sl.sdf_lan_id
ORDER BY sdc.sdf_dc_id DESC) rnk
FROM SOFTWARE SOF
JOIN SOFTWARE_LANGUAGES SL
ON (SL.SOF_SOF_ID = SOF.SOF_ID)
JOIN LANGUAGES LAN
ON (SL.LAN_LAN_ID = LAN.LAN_ID)
JOIN SOFTWARE_DEVELOPMENT_CYCLE SDC
ON (SDC.SOF_LAN_SOF_LAN_ID = SL.SOF_LAN_ID))
WHERE rnk = 1
ORDER BY VENDOR,
NAME,
LANGUAGE,
VERSION;
Аналитическая функция RANK
разделяет набор результатов на sl.sdf_lan_id
.Затем для каждого отдельного sl.sdf_lan_id
присваивается числовой ранг строке на основе убывания порядка sdc.sdf_dc_id
.Это означает, что строка с наибольшим sdc.sdf_dc_id
для определенного sl.sdf_lan_id
будет иметь RANK
, равный 1. Внешний предикат WHERE rnk=1
затем выбирает только те строки, которые имеют это максимальное значение.Это должно выполнить то же, что выполняет ваш подзапрос MAX
.