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
解决方案
您的查询非常可疑,因为您可以使用第一个查询中的微小更改来获得所需的结果,如下所示:
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')
推荐阅读
- google-tag-manager - 如何在增强型电子商务的交易中下两个订单?
- sql - Big Query 标准 SQL 中的子选择
- twitter-bootstrap - 如何在链接单击时关闭 Bootstrap 4 sidenav 菜单
- python - raise ValueError("cannot have a multithreaded and multi process server.") ValueError: cannot have a multithreaded and multi process server
- html - 使用具有多个层的层次结构时,使 div 包装其他 div
- c# - ASP.NET Core - 如何跨数据库使用身份服务?
- android - 使用自签名证书时应在 SSLContext 中使用哪个证书?自签名证书或ca证书
- angular - 角度材料选择 - 自定义模板
- javascript - 如何在没有 Webpack 的情况下使用 Babel?
- asp.net-mvc - 换行符 /r/n 来自哪里,我可以摆脱它吗?