2012-02-23 1 views
1

У меня есть запрос ниже. SOFTWARE_DEVELOPMENT_CYCLE имеет несколько строк, но меня интересует последнее.Oracle - подзапрос Refactor с max()

Я хотел бы переписать запрос, чтобы я не использовал подзапрос. Я попытался с помощью DENSE_RANK LAST ORDERY BY, но безрезультатно.

Может ли кто-нибудь посоветовать? Спасибо.

SELECT SOF.VENDOR, 
     SOF.NAME, 
     LAN.LANGUAGE, 
     SOF.VERSION, 
     SDC.STATUS, 
     SDC.SOF_DC_ID 
    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 SDC.SOF_DC_ID IN (SELECT MAX(SDC2.SOF_DC_ID) 
          FROM SOFTWARE_DEVELOPMENT_CYCLE SDC2 
          WHERE SDC2.SOF_LAN_SOF_LAN_ID = SL.SOF_LAN_ID) 
ORDER BY SOF.VENDOR, 
      SOF.NAME, 
      LAN.LANGUAGE, 
      SOF.VERSION; 

ответ

2

Вы могли бы сделать что-то вроде этого, чтобы избежать того, чтобы ударить по 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.

+0

спасибо. Не могли бы вы объяснить свой процесс, решив, как это сделать? – retrodev