简体   繁体   English

需要优化查询并循环日期

[英]Need to optimize query and loop the dates

I have a SQL query that needs to be optimized and loop cp_ex_dt field from 1st July to 20th August. 我有一个需要优化的SQL查询,并从7月1日到8月20日循环cp_ex_dt字段。 Right now i have to individually Run for each date and save the output in csv file. 现在,我必须分别为每个日期运行并将输出保存在csv文件中。 Can someone suggest me the best way to run this? 有人可以建议我最好的方法吗? Is there something i can use in rapid sql ? 有什么我可以在快速SQL中使用的吗? Please note My company doesnt allow me to run java. 请注意我的公司不允许我运行Java。

Thank you for looking into it. 谢谢您的调查。

    SELECT A.S_A
      ,C.I_N
      ,C.P_A_I
      ,C.P_A_I_TYPE
      ,C.C_C    
      ,'Tel'      
      ,A.T_T AS T_T_Tel      
      ,A.D_A AS D_A_Tel      
      ,A.C_E_D AS E_D_Tel
      ,A.C_P_D AS P_D_Tel      
      ,'BBG'      
      ,D.T_T AS T_T_BB      
      ,D.D_A AS D_A_BB      
      ,D.C_E_D AS E_D_BB
      ,D.C_P_D AS P_D_BB      
      ,'Ext'     
      ,E.T_T AS T_T_Ext      
      ,E.D_A AS D_A_Ext      
      ,E.C_E_D AS E_D_Ext
      ,E.C_P_D AS P_D_Ext      
FROM TO.CP_A_HIS A
    ,PA_MA.IN B
    ,SE.SE_MA C
    ,TO.CP_A_HIS D
    ,TO.CP_A_HIS E
WHERE A.T_T = 'CASHDIV'
AND A.C_S = 'PD'
AND A.S_A = C.S_A
AND A.S_I_INST = B.INST
AND A.CP_EX_DT = '1-Jul-2014'  
AND A.S_I_INST = 46 
AND A.S_A = D.S_A(+)
AND A.T_T = D.T_T(+)
AND A.CP_EX_DT = D.CP_EX_DT(+)
AND D.C_S(+) = 'PD'
AND D.S_I_INST(+) = 45 
AND (A.CP_REA = 'REG'
AND D.CP_REA(+) IN ('final','REG','REG cash','partnership dst'))
AND D.UPDATE_DATE(+) > '16-Apr-2014'
AND A.S_A = E.S_A(+)
AND A.T_T = E.T_T(+)
AND A.CP_EX_DT = E.CP_EX_DT(+)
AND E.C_S(+) = 'PD'
AND E.S_I_INST(+) = 51
AND A.CP_REA = E.CP_REA(+)

UNION
SELECT A.S_A
      ,C.I_N
      ,C.P_A_I
      ,C.P_A_I_TYPE
      ,C.C_C
      ,'Tel'      
      ,A.T_T AS T_T_Tel      
      ,A.D_A AS D_A_Tel      
      ,A.C_E_D AS E_D_Tel
      ,A.C_P_D AS P_D_Tel     
      ,'BBG'      
      ,D.T_T AS T_T_BB     
      ,D.D_A AS D_A_BB      
      ,D.C_E_D AS E_D_BB
      ,D.C_P_D AS P_D_BB      
      ,'Ext'      
      ,E.T_T AS T_T_Ext      
      ,E.D_A AS D_A_Ext      
      ,E.C_E_D AS E_D_Ext
      ,E.C_P_D AS P_D_Ext      
FROM TO.CP_A_HIS A
    ,PA_MA.IN B
    ,SE.SE_MA C
    ,TO.CP_A_HIS D
    ,TO.CP_A_HIS E
WHERE A.T_T = 'CASHDIV'
AND A.C_S = 'PD'
AND A.S_A = C.S_A
AND A.S_I_INST = B.INST
AND A.CP_EX_DT = '1-Jul-2014'  
AND A.S_I_INST = 46 
AND A.S_A = D.S_A(+)
AND A.T_T = D.T_T(+)
AND A.CP_EX_DT = D.CP_EX_DT(+)
AND D.C_S(+) = 'PD'
AND D.S_I_INST(+) = 45 
AND (A.CP_REA = 'SPECIAL'
AND D.CP_REA(+) IN ('special cash','SPECIAL'))
AND D.UPDATE_DATE(+) > '16-Apr-2014'
AND A.S_A = E.S_A(+)
AND A.T_T = E.T_T(+)
AND A.CP_EX_DT = E.CP_EX_DT(+)
AND E.C_S(+) = 'PD'
AND E.S_I_INST(+) = 51
AND A.CP_REA = E.CP_REA(+)

UNION
SELECT D.S_A
      ,C.I_N
      ,C.P_A_I
      ,C.P_A_I_TYPE
      ,C.C_C
      ,'Tel'      
      ,A.T_T AS T_T_Tel      
      ,A.D_A AS D_A_Tel      
      ,A.C_E_D AS E_D_Tel
      ,A.C_P_D AS P_D_Tel      
      ,'BBG'      
      ,D.T_T AS T_T_BB      
      ,D.D_A AS D_A_BB      
      ,D.C_E_D AS E_D_BB
      ,D.C_P_D AS P_D_BB      
      ,'Ext'      
      ,E.T_T AS T_T_Ext      
      ,E.D_A AS D_A_Ext      
      ,E.C_E_D AS E_D_Ext
      ,E.C_P_D AS P_D_Ext      
FROM TO.CP_A_HIS A
    ,PA_MA.IN B
    ,SE.SE_MA C
    ,TO.CP_A_HIS D
    ,TO.CP_A_HIS E
WHERE D.T_T = 'CASHDIV'
AND D.C_S = 'PD'
AND D.S_A = C.S_A
AND D.S_I_INST = B.INST
AND D.CP_EX_DT = '1-Jul-2014'  
AND D.S_I_INST = 45 
AND A.S_A(+) = D.S_A
AND A.T_T(+) = D.T_T
AND A.CP_EX_DT(+) = D.CP_EX_DT
AND A.C_S(+) = 'PD'
AND A.S_I_INST(+) = 46 
AND (A.CP_REA(+) = 'SPECIAL'
AND D.CP_REA IN ('special cash','SPECIAL'))
AND D.UPDATE_DATE > '16-Apr-2014'
AND A.INST IS NULL
AND D.S_A = E.S_A(+)
AND D.T_T = E.T_T(+)
AND D.CP_EX_DT = E.CP_EX_DT(+)
AND E.C_S(+) = 'PD'
AND E.S_I_INST(+) = 51
AND (E.CP_REA(+) = 'SPECIAL'
AND D.CP_REA IN ('special cash','SPECIAL'))

UNION
SELECT D.S_A
      ,C.I_N
      ,C.P_A_I
      ,C.P_A_I_TYPE
      ,C.C_C
      ,'Tel'      
      ,A.T_T AS T_T_Tel      
      ,A.D_A AS D_A_Tel      
      ,A.C_E_D AS E_D_Tel
      ,A.C_P_D AS P_D_Tel      
      ,'BBG'      
      ,D.T_T AS T_T_BB      
      ,D.D_A AS D_A_BB      
      ,D.C_E_D AS E_D_BB
      ,D.C_P_D AS P_D_BB      
      ,'Ext'     
      ,E.T_T AS T_T_Ext     
      ,E.D_A AS D_A_Ext      
      ,E.C_E_D AS E_D_Ext
      ,E.C_P_D AS P_D_Ext     
FROM TO.CP_A_HIS A
    ,PA_MA.IN B
    ,SE.SE_MA C
    ,TO.CP_A_HIS D
    ,TO.CP_A_HIS E
WHERE D.T_T = 'CASHDIV'
AND D.C_S = 'PD'
AND D.S_A = C.S_A
AND D.S_I_INST = B.INST
AND D.CP_EX_DT = '1-Jul-2014'  
AND D.S_I_INST = 45 
AND A.S_A(+) = D.S_A
AND A.T_T(+) = D.T_T
AND A.CP_EX_DT(+) = D.CP_EX_DT
AND A.C_S(+) = 'PD'
AND A.S_I_INST(+) = 46 
AND (A.CP_REA(+) = 'REG'
AND D.CP_REA IN ('final','REG','REG cash','partnership dst'))
AND D.UPDATE_DATE > '16-Apr-2014'
AND A.INST IS NULL
AND D.S_A = E.S_A(+)
AND D.T_T = E.T_T(+)
AND D.CP_EX_DT = E.CP_EX_DT(+)
AND E.C_S(+) = 'PD'
AND E.S_I_INST(+) = 51
AND (E.CP_REA(+) = 'REG'
AND D.CP_REA IN ('final','REG','REG cash','partnership dst'))

Your first two part union queries are almost identical with exception of the "REG" and "SPECIAL" entries that correlate to your "D" alias. 除了与您的“ D”别名相关的“ REG”和“ SPECIAL”条目外,前两个部分的联合查询几乎相同。 These two could be simplified by using the first select but changing the area at: 可以通过使用第一个选择来简化这两个,但是在以下位置更改区域:

  AND D.S_I_INST(+) = 45 
  AND (
         (     A.CP_REA = 'REG'
           AND D.CP_REA(+) IN ('final','REG','REG cash','partnership dst')
         )
         OR
         (    A.CP_REA = 'SPECIAL'
          AND D.CP_REA(+) IN ('special cash','SPECIAL')
         )
       )

and will completely remove the first union against the "A" table. 并将完全删除针对“ A”表的第一个联合。

Your third and fourth unions are similar but pulling from the "D" table that has your "A" table as NULL. 您的第三个和第四个并集是相似的,但是是从“ D”表中提取的,其中“ A”表为NULL。 Change it's where clause at: 在以下位置更改where子句:

  AND A.S_I_INST(+) = 46 
  AND (
        (     A.CP_REA(+) = 'REG'
          AND D.CP_REA IN ('final','REG','REG cash','partnership dst')
        )
        OR
        (     A.CP_REA(+) = 'SPECIAL'
          AND D.CP_REA IN ('special cash','SPECIAL')
        )
      )

So this should result in a simplified 所以这应该导致简化

select fields
   from your "A" based query
union
select fields
   from your "D" based query

Additionally, it COULD probably be simplified more, but without seeing more context of the data, the self-join for the "A" and "D" tables would probably eliminate the union, but unsure as it is currently presented. 另外,它可能可以进一步简化,但是如果看不到数据的更多上下文,“ A”和“ D”表的自联接可能会消除并集,但不能确定当前是否提供此并集。

EDIT per feedback Not being an Oracle specialist, but do recognize the (+) is an indicator to a left-join syntax... and not having oracle to try with actual sample tables and data, I can only offer the following slight adjustment. 根据反馈进行编辑并不是Oracle专家,但确实知道(+)是左联接语法的指示...并且没有oracle尝试使用实际的示例表和数据,我只能提供以下一些细微调整。 It appears you are dealing with transactions that whenever "A" is a "REG", the only possibilities for the "D.CP_REA" would be the IN list provided, and there would never be an "A.CP_CREA" as "REG" and the "D" side having the 'special cash' or 'SPECIAL'... and vice-versa. 看来您正在处理的事务是,无论何时“ A”是“ REG”,“ D.CP_REA”的唯一可能就是提供的IN列表,而永远不会有“ A.CP_CREA”作为“ REG”而“ D”面则带有“特殊现金”或“特殊” ...反之亦然。 If so, maybe you could adjust to 如果是这样,也许您可​​以调整为

  AND D.S_I_INST(+) = 45 
  AND A.CP_REA IN ( 'REG', 'SPECIAL' )
  AND D.CP_REA(+) IN ( 'final','REG','REG cash','partnership dst', 
                       'special cash','SPECIAL')

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM