【问题标题】:Oracle - Refactor subquery with max()Oracle - 使用 max() 重构子查询
【发布时间】:2012-02-23 16:30:00
【问题描述】:

我有以下问题。 SOFTWARE_DEVELOPMENT_CYCLE 有多行,但我对最新的感兴趣。

我想重写查询以便不使用子查询。我已尝试使用 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;

【问题讨论】:

    标签: sql oracle refactoring subquery analytic-functions


    【解决方案1】:

    您可以这样做以避免再次访问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 子查询相同的事情。

    【讨论】:

    • 谢谢。你能解释一下你决定如何做的过程吗?
    猜你喜欢
    • 2021-07-08
    • 1970-01-01
    • 2019-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    相关资源
    最近更新 更多