簡體   English   中英

通過循環子查詢中的值來執行查詢

[英]Execute query by looping through values within a subquery

我不知道我想要實現的目標甚至是可能的,因此我正在與這里的專家聯系以提供一些指導。

我創建了一個 excel 宏,它在多個 Oracle 數據庫中運行多個查詢。 我遇到的一個問題是,其中一個查詢在執行期間只能在 where 子句中使用單個值,因為我只需要檢索第一行數據(其中 rownum=1),並且可能有數百個這樣的唯一值。

我能夠執行此操作的唯一方法是在 excel 中創建一系列值,打開數據庫連接,執行查詢,將結果寫回電子表格,關閉連接,然后移至該范圍內的下一個值,對范圍內的每個值重復此操作。 這已被證明是非常低效的,所以我正在尋找一種方法來直接在數據庫中循環這些值。

整個查詢超過 650 行,但我提供了一個片段來幫助闡明我希望實現的目標。 “START”是子查詢的開始,它提取我需要循環的唯一值(GS_GRP_SEQ),“END”是子查詢的結束。

我真誠地感謝您花時間幫助我!

    SELECT * FROM 
    (SELECT TRIM(CS.CS_NBR) AS CS_Num, TRIM(CS.CS_NAM) AS CName, 
    TO_CHAR(to_date(CS.CS_EFF_DAT,'yyyymmdd'),'mm/dd/yyyy') AS C_Eff_Dte,
    CASE CS.UR_ID
    WHEN 'ABC' THEN 'JOHNNY PARKER'
    WHEN '999' THEN 'UNDEFINED'
    END AS UR_Name,
    G.GS_GRP_SEQ as GR_Num, 
    Case G.GS_STAT
    WHEN '0' THEN 'READY'
    END AS GR_Stat,
    CASE G.GS_FUN_ARR
    WHEN '1' THEN 'INCREASED'
    WHEN '9' THEN 'DECREASED'
    END AS Type_Desc,
    R.RT_TOT_RATE AS RATE_TOT,
    TO_CHAR(to_date(R.RT_TOT_RATE_EFF_DT,'yyyymmdd'),'mm/dd/yyyy') as RT_Eff_Dte, 
    R.RT_TOT_1 as Rate_Type_1, R.RT_AMT_1 as Rate_Amount_1, 
    R.RT_TOT_2 as Rate_Type_2, R.RT_AMT_2 as Rate_Amount_2
    FROM MNDB.CASE CS 
    inner join MNDB.CADR CA on CA.CS_ROOT_KEY = CS.CS_NBR
    inner join MNDB.GRPR G on CS.CS_NBR = G.GS_CS_NBR
    inner join MNDB.GCNT GC on GC.GS_GRP_SEQ = G.GS_GRP_SEQ
    inner join MNDB.TOTR R on R.ACCESS_LEVEL = GC.GS_GRP_SEQ
    INNER JOIN MNDB.PROD P ON TRIM(P.PROD_GRP) = TRIM(G.GS_PROD_CD) 
    LEFT JOIN MNDB.GNAT NAT ON G.GS_GRP_SEQ = NAT.GS_GRP_SEQ
    WHERE CS.CS_NBR = ('123456') 
    AND G.GS_GRP_SEQ IN 
--START--    
   (SELECT DISTINCT GS_GRP_SEQ FROM MNDP.GRPR where CS.CS_NBR = ('123456') and GS_STAT_CD in ('0','2','6') 
--END--
   ORDER BY CA.CS_ADR_PRC_DTE desc, RT_TOT_RATE_EFF_DT desc, RT_TOT_RATE_TERM_DT ASC ) where rownum=1

在您的內部 SQL 語句中,添加一個新列,如下所示:

row_number () over (
           partition by <list of columns in each group>
           order by <required columns> desc
         ) rn

然后在外部 SQL 過濾器中:

where rn=1

使用@NickW 提供的解決方案,我能夠通過如下修改代碼來達到預期的結果:

    SELECT * FROM 
    (SELECT TRIM(CS.CS_NBR) AS CS_Num, TRIM(CS.CS_NAM) AS CName, 
    TO_CHAR(to_date(CS.CS_EFF_DAT,'yyyymmdd'),'mm/dd/yyyy') AS C_Eff_Dte,
    CASE CS.UR_ID
    WHEN 'ABC' THEN 'JOHNNY PARKER'
    WHEN '999' THEN 'UNDEFINED'
    END AS UR_Name,
    G.GS_GRP_SEQ as GR_Num, 
    Case G.GS_STAT
    WHEN '0' THEN 'READY'
    END AS GR_Stat,
    CASE G.GS_FUN_ARR
    WHEN '1' THEN 'INCREASED'
    WHEN '9' THEN 'DECREASED'
    END AS Type_Desc,
    R.RT_TOT_RATE AS RATE_TOT,
    TO_CHAR(to_date(R.RT_TOT_RATE_EFF_DT,'yyyymmdd'),'mm/dd/yyyy') as RT_Eff_Dte, 
    R.RT_TOT_1 as Rate_Type_1, R.RT_AMT_1 as Rate_Amount_1, 
    R.RT_TOT_2 as Rate_Type_2, R.RT_AMT_2 as Rate_Amount_2,
row_number () over (
           PARTITION BY GS_GRP_SEQ
           ORDER BY GS_GRP_SEQ, CA.CS_ADR_PRC_DTE desc, RT_TOT_RATE_EFF_DT desc, RT_TOT_RATE_TERM_DT ASC
         ) rn
    FROM MNDB.CASE CS 
    inner join MNDB.CADR CA on CA.CS_ROOT_KEY = CS.CS_NBR
    inner join MNDB.GRPR G on CS.CS_NBR = G.GS_CS_NBR
    inner join MNDB.GCNT GC on GC.GS_GRP_SEQ = G.GS_GRP_SEQ
    inner join MNDB.TOTR R on R.ACCESS_LEVEL = GC.GS_GRP_SEQ
    INNER JOIN MNDB.PROD P ON TRIM(P.PROD_GRP) = TRIM(G.GS_PROD_CD) 
    LEFT JOIN MNDB.GNAT NAT ON G.GS_GRP_SEQ = NAT.GS_GRP_SEQ
    WHERE CS.CS_NBR = ('123456') 
    AND G.GS_GRP_SEQ IN    
   (SELECT DISTINCT GS_GRP_SEQ FROM MNDP.GRPR where CS.CS_NBR = ('123456') and GS_STAT_CD in ('0','2','6') 
   ORDER BY GS_GRP_SEQ 
) where rn=1

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM