2016-03-01 6 views
-1

У меня есть отчет, в котором используется дюжина CTE и длится долго, чтобы выполнить. Дело в том, что многие из этих КТР используют одни и те же таблицы, соединенные таким же образом, но на разных условиях, в зависимости от колонки:Как избежать двух аналогичных определений CTE

WITH 
Kps_CTE (sp_id,ksd_ma_s) As 
    (
     select wir_sp_id,SUM(ksd_ma) 
      from ksd 
      inner join ks on ksd_ks_id=ks_id 
      inner join do ON ksd_do_id=do_id AND do_dot_id in (101) 
      inner join wi ON do_wi_id=wi_id 
      inner join wir ON wir_wi_id=wi_id 
      INNER JOIN sp ON wir_sp_id=sp_id 
      where ksd_ksk_id=13 
       AND sp_date >= '2013-01-01' 
      group by wir_sp_id 
    ),  
    Kis_CTE (sp_id,ksd_wn_s) As 
    (
     select wir_sp_id,SUM(ksd_wn) 
      from ksd 
      inner join ks on ksd_ks_id=ks_id 
      inner join do ON ksd_do_id=do_id AND do_dot_id in (4) 
      inner join wi ON do_wi_id=wi_id 
      inner join wir ON wir_wi_id=wi_id 
      INNER JOIN sp ON wir_sp_id=sp_id 
      where ksd_ksk_id=14 
       AND sp_date>= '2013-01-01' 
      group by wir_sp_id 
    ) 


select * from ... 

Так что сейчас я получаю только два столбца на каждую таблицу. Я хотел бы избежать повторного объединения одних и тех же таблиц и создания нескольких столбцов в одном CTE с использованием разных условий. Это возможно? Если я просто присоединяюсь к этим двум, я не буду экономить много ресурсов.

ответ

1

Вы должны описать, что вы делаете с этими CTE. Возможно, это может выяснить ваше дело:

;WITH Kps_CTE (sp_id,ksd_ma_s) As 
(
    select wir_sp_id, 
     SUM(case when ksd_ksk_id=13 then ksd_ma end) as KPS, 
     Sum(case when ksd_ksk_id=14 then ksd_wn end) as KIS, 
    from ksd 
    inner join ks on ksd_ks_id=ks_id 
    inner join do ON ksd_do_id=do_id 
    inner join wi ON do_wi_id=wi_id 
    inner join wir ON wir_wi_id=wi_id 
    INNER JOIN sp ON wir_sp_id=sp_id 
    where (ksd_ksk_id=13 AND do_dot_id = 101 
     OR ksd_ksk_id=14 and do_dot_id = 4) 
     AND sp_date >= '2013-01-01' 
    group by wir_sp_id 
), 

Если OR список велик - он может быть преобразован в другой КТР со списком кортежей (ksd_ksk_id; do_dot_id), а затем присоединился.

Не знаете, почему у вас есть все эти магические числа в запросе, не удивляйтесь, если, наконец, мы узнаем, что вам действительно нужно PIVOT или что-то в этом роде.

 Смежные вопросы

  • Нет связанных вопросов^_^