Оптимизация соединений с помощью CTE - PullRequest
0 голосов
/ 27 февраля 2020

У меня есть запрос, пожалуйста, помогите мне с возможными способами оптимизировать мой запрос. Я использовал два CTE, а затем применил JOIN. Первый CTE предоставляет данные за 2018 год, а второй CTE - данные за 2019 год. Два данных о соединении за оба года в стране, к которой я присоединился.

Запрос

    with cte as
    (
     select aa.Country_Name, SUM(MQTY) Qty from(
     select * from ExportData where YEAR in ('0119','0219','0319') and FINANCIAL_YEAR='2018-19'
    union
    select * from ExportData where YEAR not in ('0120','0220','0320') and FINANCIAL_YEAR='2019-20'
    )ab inner join countrymaster aa on COD=Country_Code
     where DCODE in ('0502','0503','0504','0505','0506','0507','0508')
     group by aa.Country_Name
    )
     ,cte1 as
    (
    select aa.Country_Name, SUM(MQTY) Qty from (
    select * from ExportData where YEAR in ('0118','0218','0318') and FINANCIAL_YEAR='2017-18'
    union
    select * from ExportData where YEAR not in ('0119','0219','0319') and FINANCIAL_YEAR='2018-19'
    )ab inner join countrymaster aa on COD=Country_Code
     where DCODE in ('0502','0503','0504','0505','0506','0507','0508')
     group by DGCTRCOD,aa.Country_Name
     ) 
     select cte.Country_Name, cte1.Qty 'Qty 2018', cte.Qty 'QTY 2019' from cte 
     inner join cte1 on cte.Country_Name = cte1.Country_Name

Требуемый выход:

Output

Ответы [ 3 ]

0 голосов
/ 27 февраля 2020

Не думаю, что вам нужен UNION или CTE. Вы можете получить желаемый результат, используя условие OR в предложении where, как показано ниже

  select aa.Country_Name, SUM(MQTY) Qty 
  from(
          select * 
          from ExportData 
          where ( YEAR in ('0119','0219','0319') and FINANCIAL_YEAR='2018-19' ) OR
                ( YEAR not in ('0120','0220','0320') and FINANCIAL_YEAR='2019-20') OR
                ( YEAR in ('0118','0218','0318') and FINANCIAL_YEAR='2017-18') OR
                ( YEAR not in ('0119','0219','0319') and FINANCIAL_YEAR='2018-19')

   )ab 
   inner join countrymaster aa on COD=Country_Code
   where DCODE in ('0502','0503','0504','0505','0506','0507','0508')
   group by aa.Country_Name 
0 голосов
/ 20 марта 2020

Временные таблицы могут использоваться вместо Cte, это должно улучшить производительность

Create table #T
  ( Country_Name varchar(max),
    Qty INT
  )

 Create table #T1
  ( Country_Name varchar(max),
    Qty INT
  )


INSERT INTO #T
          select aa.Country_Name, SUM(MQTY) Qty 
          from(
                  select * 
                  from ExportData 
                  where YEAR in ('0119','0219','0319') and 
                        FINANCIAL_YEAR='2018-19'
                  union
                  select * 
                  from ExportData 
                  where YEAR not in ('0120','0220','0320') and
                  FINANCIAL_YEAR='2019-20'
           )ab 
           inner join countrymaster aa on COD=Country_Code
           where DCODE in ('0502','0503','0504','0505','0506','0507','0508')
           group by aa.Country_Name


 INSERT INTO #T1
           select aa.Country_Name, SUM(MQTY) Qty 
           from (
                   select * 
                   from ExportData  
                   where YEAR in ('0118','0218','0318') and 
                         FINANCIAL_YEAR='2017-18'
                   union
                   select * 
                   from ExportData 
                   where YEAR not in ('0119','0219','0319') and 
                         FINANCIAL_YEAR='2018-19'
                )ab 
                inner join countrymaster aa on COD=Country_Code
                where DCODE in ('0502','0503','0504','0505','0506','0507','0508')
                group by aa.Country_Name


SELECT  cte.Country_Name, cte1.Qty 'Qty 2018', cte.Qty 'QTY 2019' 
FROM #T 
     INNER JOIN #T1 on T.Country_Name = T1.Country_Name
0 голосов
/ 27 февраля 2020

Вы можете начать с обхода (выберите *) и выбрать только те столбцы, которые вам нужны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...