1

以下のクエリがあります。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;
4

1 に答える 1

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_idaRANKは1になります。次に、外部WHERE rnk=1述部は、その最大値を持つ行のみを選択します。MAXこれにより、サブクエリが実行しているのと同じことが実行されます。

于 2012-02-23T16:39:41.673 に答える