2012-02-23 8 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に基づいて行に数値ランクを割り当てています。つまり、sdc.sdf_dc_idの最大値の行が特定のsl.sdf_lan_idの場合、RANKが1になります。外側のWHERE rnk=1述部は、その最大値を持つ行のみを選択します。それはあなたのMAXサブクエリが達成しているのと同じことを達成するはずです。

+0

ありがとうございます。それをどうやって決めるのかあなたのプロセスを説明できますか? – retrodev

関連する問題