Нужно оптимизировать запрос и зациклить даты

У меня есть SQL-запрос, который необходимо оптимизировать и зациклить поле cp_ex_dt с 1 июля по 20 августа. Прямо сейчас я должен индивидуально работать для каждой даты и сохранить вывод в CSV-файл. Может кто-нибудь предложить мне лучший способ запустить это? Есть ли что-то, что я могу использовать в быстрой SQL? Обратите внимание, что моя компания не позволяет мне запускать Java.

Спасибо, что заглянули в это.

    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 ответ

Решение

Ваши первые два запроса объединения частей почти идентичны, за исключением записей "REG" и "SPECIAL", которые соответствуют вашему псевдониму "D". Эти два можно упростить, используя первый выбор, но изменив область в:

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

и полностью удалит первый союз против таблицы "A".

Ваш третий и четвертый союзы похожи, но извлекают из таблицы "D", в которой ваша таблица "А" равна NULL. Изменить это где пункт в:

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

Так что это должно привести к упрощенному

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

Кроме того, это МОЖЕТ быть, вероятно, еще более упрощено, но, не видя большего контекста данных, самосоединение для таблиц "A" и "D", вероятно, устранит объединение, но неуверенно, как оно представлено в настоящее время.

РЕДАКТИРОВАТЬ за отзыв Не будучи специалистом Oracle, но признавая (+), является индикатором синтаксиса левого соединения... и не имея оракула, чтобы попытаться использовать реальные образцы таблиц и данных, я могу предложить лишь небольшую корректировку. Похоже, вы имеете дело с транзакциями, которые, когда "A" является "REG", единственными возможностями для "D.CP_REA" будет предоставленный список IN, и никогда не будет "A.CP_CREA" в качестве "REG". и сторона "D", имеющая "специальные деньги" или "СПЕЦИАЛЬНЫЕ"... и наоборот. Если так, возможно, вы могли бы приспособиться к

  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')
Другие вопросы по тегам