Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何避免两个类似的CTE定义_Sql Server_Performance_Sql Tuning - Fatal编程技术网

Sql server 如何避免两个类似的CTE定义

Sql server 如何避免两个类似的CTE定义,sql-server,performance,sql-tuning,Sql Server,Performance,Sql Tuning,我有一份报告,它使用了十几个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

我有一份报告,它使用了十几个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中创建几列。这可能吗?如果我加入这两个团队,我不会节省太多资源。

你必须描述一下你在用这些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
),
如果
列表较大,则可能会将其转换为另一个具有元组列表
(ksd\u ksk\u id;do\u dot\u id)
的CTE,然后加入

不知道为什么查询中会有这么多神奇的数字,如果我们最终发现您确实需要
PIVOT
或其他什么,我们也不会感到惊讶