左连接与子查询

时间:2021-02-02 05:55:15

标签: sql

我有以下带有左连接的查询,我可以将其设为子查询吗?因为它是同一张桌子,它会工作得更快吗? 我只想获取收入行并仅为他们显示收入2

SELECT *
FROM
    (SELECT 
         s_campaign_id,
         SUM(CASE
                WHEN d_gen_date BETWEEN '2021-01-31' AND '2021-01-31'
                   THEN f_revenue
                   ELSE 0
             END) AS revenue,
         SUM(CASE
                WHEN d_gen_date BETWEEN '2021-01-30' AND '2021-01-30' 
                   THEN f_revenue
                   ELSE 0
             END) AS revenue2
     FROM 
         tbl_reports
     WHERE 
         (d_gen_date >= '2021-01-31'
          AND d_gen_date <= '2021-01-31')
     GROUP BY 
         s_campaign_id) d1
LEFT JOIN
    (SELECT 
         s_campaign_id,
         SUM(CASE
                WHEN d_gen_date BETWEEN '2021-01-30' AND '2021-01-30' 
                   THEN f_revenue
                   ELSE 0
             END) AS revenue2
     FROM 
         tbl_reports
     WHERE 
         (d_gen_date BETWEEN '2021-01-30' AND '2021-01-30')
     GROUP BY 
         s_campaign_id) d2 ON d1.s_campaign_id = d2.s_campaign_id

3 个答案:

答案 0 :(得分:0)

您的查询非常可疑,因为您可以在第一个查询中使用微小的更改来获得所需的结果,如下所示:

  SELECT T.* FROM
  (SELECT s_campaign_id,
         SUM(CASE WHEN d_gen_date = '2021-01-31' THEN f_revenue ELSE 0 END) AS revenue,
         SUM(CASE WHEN d_gen_date = '2021-01-30' THEN f_revenue ELSE 0 END) AS revenue2 
    FROM tbl_reports 
   WHERE (d_gen_date>='2021-01-30' AND d_gen_date<='2021-01-31') 
   GROUP BY s_campaign_id) T
   WHERE EXISTS (select 1 from tbl_reports tt 
                  where t.s_campaign_id = tt.s_campaign_id
                    and tt.d_gen_date ='2021-01-31')

答案 1 :(得分:0)

只使用聚合,你不需要因为你使用相同的日期

select s_campaign_id,
SUM(CASE WHEN d_gen_date ='2021-01-31' THEN f_revenue
                ELSE 0
             END) AS revenue,
SUM(CASE WHEN d_gen_date ='2021-01-30' THEN f_revenue
                ELSE 0
             END) AS revenue2    
FROM   tbl_reports 
WHERE              d_gen_date>='2021-01-30' and  d_gen_date<='2021-01-31'
     GROUP BY 
         s_campaign_id

答案 2 :(得分:0)

您正在使用条件聚合,即聚合函数 (SUM(CASE WHEN ... END)) 内的条件。但是由于您的 WHERE 子句,这些条件要么总是满足,要么总是不满足。因此,您可以简化查询,因为您不需要条件聚合:

SELECT d1.s_campaign_id, d1.revenue, d2.revenue2
FROM
(
  SELECT s_campaign_id, SUM(f_revenue) AS revenue
  FROM tbl_reports
  WHERE d_gen_date = '2021-01-31'
  GROUP BY s_campaign_id
) d1
LEFT JOIN
(
  SELECT s_campaign_id, SUM(f_revenue) AS revenue2
  FROM tbl_reports
  WHERE d_gen_date = '2021-01-30'
  GROUP BY s_campaign_id
) d2 ON d1.s_campaign_id = d2.s_campaign_id;

或者您确实使用了条件聚合,但是您不需要加入两个中间结果集:

SELECT 
  s_campaign_id,
  SUM(CASE WHEN d_gen_date = '2021-01-31' THEN f_revenue ELSE 0 END) AS revenue,
  SUM(CASE WHEN d_gen_date = '2021-01-30' THEN f_revenue ELSE 0 END) AS revenue2
FROM tbl_reports
WHERE d_gen_date >= '2021-01-30' AND d_gen_date <= '2021-01-31'
GROUP BY s_campaign_id
HAVING MAX(CASE WHEN d_gen_date = '2021-01-31' THEN 1 ELSE 0 END) = 1;

任何一个查询都应该受益于这个索引:

CREATE INDEX idx ON tbl_reports (d_gen_date, s_campaign_id);
相关问题