Как использовать с оператором в этом запросе? - PullRequest
0 голосов
/ 04 ноября 2019

В этом запросе я хочу использовать with-Statement. У меня есть подзапрос, который вычисляет объединение всех B, и я хочу использовать его с оператором with. Но когда я использую оператор with, я сталкиваюсь с ошибкой, в которой говорится, что «таблица или представление не существует». Что меня удивляет, так это то, что когда я заменяю первую часть на with-Statement, она работает правильно. Но когда я заменяю вторую часть, я сталкиваюсь с этой ошибкой !!

select 

 deposit.BRNCH_COD||'-'||deposit.DP_TYPE_COD||''||deposit.CUSTOMER_NUM||'- 
 '||deposit.DEPOSIT_SERIAL  AS DEPOSIT_NUMBER,
      deposit.IBAN              AS IBAN,
      deposit.CURRENCY_DESC     AS DEPOSIT_CURRCOD,
      deposit.BRNCH_COD         AS BRNCH_COD,
      MAIN_7.Still_Days                                                                           
AS Still_Lenght,
      to_char(MAIN_7.Startdate, 'yyyy/mm/dd' ,'nls_calendar=persian') AS 
 START_DATE,
      MAIN_7.AMOUNT                                                                               
  AS TOTAL_AMOUNT,
      MAIN_7.TRN_Count                                                                            
AS TRN_Count

      from
      (

      select  Trans_Table.DEPOSIT_KEY                     AS DEPOSIT_KEY,
      Trans_Table.TRN_Start_DATE                  AS Startdate,
      MAX(Active_Time_Table.EFFECTIVE_DATE)       AS Lastdate,
      H.PASSIVE_DAYS                    AS Still_Days,
      SUM(Active_Time_Table.AMOUNT)               AS AMOUNT,
      Count(Active_Time_Table.AMOUNT)             AS TRN_Count
      from
      (
      Select F.DEPOSIT_KEY,
      SUM (F.AMOUNT)         AS TRN_AMOUNT,
      MIN (F.EFFECTIVE_DATE) AS TRN_Start_DATE
      from
      (
      A
      union all
      B
      )F
      Group by (F.DEPOSIT_KEY)
      Having ( SUM (F.AMOUNT) >10000000000)
      )Trans_Table


      inner join
     H
      on (Trans_Table.DEPOSIT_KEY = H.DEPOSIT_KEY and 
       Trans_Table.TRN_Start_DATE-1 = H.EFFECTIVE_DATE)

      inner join
      (

      A
      union all
      B
      )Active_Time_Table
      on (Trans_Table.DEPOSIT_KEY = Active_Time_Table.DEPOSIT_KEY and 
      Active_Time_Table.EFFECTIVE_DATE - Trans_Table.TRN_Start_DATE< 4 and 
      Active_Time_Table.EFFECTIVE_DATE - Trans_Table.TRN_Start_DATE>=0)

      group by ( Trans_Table.DEPOSIT_KEY , 
      Trans_Table.TRN_Start_DATE,H.PASSIVE_DAYS)
      Having  (SUM(Active_Time_Table.AMOUNT)) > 10000000000
      )MAIN_7


      inner join dimamldeposit deposit
      on deposit.DEPOSIT_KEY = MAIN_7.DEPOSIT_KEY



       ***********************************************************


   with rep as
  (A union all B)
    select

      deposit.BRNCH_COD||'-'||deposit.DP_TYPE_COD||'- 
    '||deposit.CUSTOMER_NUM||'-'||deposit.DEPOSIT_SERIAL  AS DEPOSIT_NUMBER,
      deposit.IBAN              AS IBAN,
      deposit.CURRENCY_DESC     AS DEPOSIT_CURRCOD,
      deposit.BRNCH_COD         AS BRNCH_COD,
      MAIN_7.Still_Days                                                                           AS Still_Lenght,
      to_char(MAIN_7.Startdate, 'yyyy/mm/dd' ,'nls_calendar=persian') AS START_DATE,
      MAIN_7.AMOUNT                                                                               AS TOTAL_AMOUNT,
      MAIN_7.TRN_Count                                                                            AS TRN_Count
      from
      (
      select  Trans_Table.DEPOSIT_KEY                     AS DEPOSIT_KEY,
      Trans_Table.TRN_Start_DATE                  AS Startdate,
      MAX(rep.EFFECTIVE_DATE)       AS Lastdate,
      H.PASSIVE_DAYS                    AS Still_Days,
      SUM(rep.AMOUNT)               AS AMOUNT,
      Count(rep.AMOUNT)             AS TRN_Count
      from
      (
      Select rep.DEPOSIT_KEY,
      SUM (rep.AMOUNT)         AS TRN_AMOUNT,
      MIN (rep.EFFECTIVE_DATE) AS TRN_Start_DATE
      from
     rep
      Group by (rep.DEPOSIT_KEY)
      Having ( SUM (rep.AMOUNT) >10000000000)
      )Trans_Table
      inner join
     H
      on (Trans_Table.DEPOSIT_KEY = H.DEPOSIT_KEY and Trans_Table.TRN_Start_DATE-1 = H.EFFECTIVE_DATE)

      inner join
      rep rep
      on (Trans_Table.DEPOSIT_KEY = rep.DEPOSIT_KEY and rep.EFFECTIVE_DATE - Trans_Table.TRN_Start_DATE< 4 and rep.EFFECTIVE_DATE - Trans_Table.TRN_Start_DATE>=0)

      group by ( Trans_Table.DEPOSIT_KEY , Trans_Table.TRN_Start_DATE,H.PASSIVE_DAYS)
      Having  (SUM(rep.AMOUNT)) > 10000000000
      )MAIN_7


      inner join dimamldeposit deposit
      on deposit.DEPOSIT_KEY = MAIN_7.DEPOSIT_KEY

1 Ответ

1 голос
/ 04 ноября 2019

Это много кода, но - чтобы упростить его, я бы посоветовал вам использовать WITH выражение факторинга в качестве первой команды, включить в нее все таблицы, которые вы используете, а затем - в качестве окончательной SELECT -получить данные из всех этих CTE. Как то так:

with 
a as (select ... from ...),
b as (select ... from ...),
f as (select ... from ...),
...
select a.col1, b.col2, f.col3
from a join b on a.id = b.id
left join f on f.id = b.id
where ...
...