Sql Oracle-使用max()重构子查询

Sql Oracle-使用max()重构子查询,sql,oracle,refactoring,subquery,analytic-functions,Sql,Oracle,Refactoring,Subquery,Analytic Functions,我有下面的问题。软件开发周期有多行,但我对最新的有兴趣 我想重写查询,以便不使用子查询。我已经尝试过了,但没有成功 有人能给我建议吗?多谢各位 SELECT SOF.VENDOR, SOF.NAME, LAN.LANGUAGE, SOF.VERSION, SDC.STATUS, SDC.SOF_DC_ID FROM SOFTWARE SOF JOIN SOFTWARE_LANGUAGES SL ON

我有下面的问题。软件开发周期有多行,但我对最新的有兴趣

我想重写查询,以便不使用子查询。我已经尝试过了,但没有成功

有人能给我建议吗?多谢各位

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;

您可以这样做,以避免再次点击
软件开发周期

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\u lan\u id
,它将根据
sdc.sdf\u dc\u id
的降序为行分配一个数字秩。这意味着对于特定的
sl.sdf\u lan\u id
具有最大
sdc.sdf\u dc\u id
的行的
秩将为1。然后,外部
其中rnk=1
谓词只选择具有该最大值的行。这应该完成与您的
MAX
子查询相同的任务。

谢谢。你能解释一下你决定怎么做的过程吗?