Need to optimize query and loop the dates

94 Views Asked by At

I have a SQL query that needs to be optimized and loop cp_ex_dt field from 1st July to 20th August. Right now i have to individually Run for each date and save the output in csv file. Can someone suggest me the best way to run this? Is there something i can use in rapid sql ? Please note My company doesnt allow me to run 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'))
1

There are 1 best solutions below

3
On BEST ANSWER

Your first two part union queries are almost identical with exception of the "REG" and "SPECIAL" entries that correlate to your "D" alias. 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.

Your third and fourth unions are similar but pulling from the "D" table that has your "A" table as NULL. Change it's where clause at:

  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.

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. 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. 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')