2016-03-01 69 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列表大 - 它可以被转换成另一种CTE与元组(ksd_ksk_id; do_dot_id)的名单,然后加入。

不知道为什么你在查询中有所有这些神奇的数字,如果最终我们会发现你实际上需要PIVOT什么的,也不会感到惊讶。