2012-02-23 48 views
1

我有下面的查询。 SOFTWARE_DEVELOPMENT_CYCLE有多行,但我对最新版本感兴趣。Oracle - 用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的降序为该行分配一个数字等级。这意味着对于特定的sl.sdf_lan_id具有最大sdc.sdf_dc_id的行将具有为RANK的1。外部WHERE rnk=1谓词然后仅选择具有该最大值的行。这应该完成与MAX子查询正在完成的相同的事情。

+0

谢谢。你能否解释你的过程,以决定如何做到这一点? – retrodev 2012-02-23 16:48:22