千家信息网

sql中如何将full join改为left join +union all

发表于:2026-11-02 作者:千家信息网编辑
千家信息网最后更新 2026年11月02日,这篇文章主要介绍sql中如何将full join改为left join +union all,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!今天收到一个需求,要改写一个报表的逻辑
千家信息网最后更新 2026年11月02日sql中如何将full join改为left join +union all

这篇文章主要介绍sql中如何将full join改为left join +union all,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

今天收到一个需求,要改写一个报表的逻辑,当改完之后,再次运行,发现运行超时。

因为特殊原因,无法访问客户的服务器,没办法查看sql的执行计划、没办法知道表中的索引情况,所以,尝试从语句的改写上来优化。

一、原始语句如下:

select isnull(vv.customer_id,v.customer_id) as customer_id,                isnull(vv.business_date,replace(v.business_date,'-','')) as business_date,                v.prod_id,                v.sales,                vv.visit_count,    v.all_salesfrom (  SELECT a.customer_id ,            max(month)+'-01' as business_date,      a.PROD_ID ,      SUM(CAST(VALUE AS NUMERIC(38, 3))) sales,      sum(SUM(CAST(VALUE AS NUMERIC(38, 3)))) over(partition by a.customer_id) as all_sales                                                          FROM  TB_IMPORT_SALES a   WHERE  a.customer_id IS NOT NULL      AND a.PROD_ID IS NOT NULL                        and a.month='2016-11'  GROUP BY a.customer_id ,      a.PROD_ID)vfull join(  SELECT customer_id,             max(a.business_date) as business_date,      COUNT(*) AS VISIT_COUNT         FROM TB_CALL_STORE a WITH(NOLOCK)        inner join TB_TIME d        on a.business_date = d.t_date         where d.section ='2016-11'        GROUP BY customer_id)vvon v.customer_id = vv.customer_id

原来是left join,虽然查询比较慢,但是2分钟能查出来,现在按照业务要求,需要看到所有数据,所以改成了full join,改了之后5分钟都查不出结果。

二、改写后的代码

select v.customer_id,                replace(max(v.business_date),'-','') as business_date,                v.prod_id,                max(v.sales_volume) sales_volume ,                max(v.visit_count) visit_count,        max(v.all_sales_volume) all_sales_volumefrom (  SELECT a.customer_id ,            max(biz_month)+'-01' as business_date,      a.PROD_ID ,      SUM(CAST(VALUE1 AS NUMERIC(38, 8))) sales_volume,      sum(SUM(CAST(VALUE1 AS NUMERIC(38, 8)))) over(partition by a.customer_id) as all_sales_volume,                        null as visit_count                                                          FROM  TB_IMPORT_SALES a   WHERE  a.customer_id IS NOT NULL      AND a.PROD_ID IS NOT NULL                        and a.month='2016-11'  GROUP BY a.customer_id ,       a.PROD_ID  union all   SELECT customer_id,             max(a.business_date) as business_date,                  p.prod_id,                  null,                  null,      COUNT(*) AS VISIT_COUNT         FROM TB_CALL_STORE a WITH(NOLOCK)        cross apply        (                select top 1 prod_id from TB_PRODUCT with(nolock)        )p        inner join TB_TIME d        on a.business_date = d.t_date         where d.section ='2016-11'        GROUP BY customer_id,p.prod_id)vgroup by v.customer_id,     v.prod_id

由于代码本身比较简单,没办法再进一步简化,而由于连接不了服务器,其他的方法也用不上,甚至没办法分析到底是什么导致运行这么慢。

想了想,full join 本质上就是 2次left join+union ,无非就是合并数据,于是尝试一下用union all来直接合并数据,现在改成unoin all最后,就不需要full join。

但是考虑到第2段代码中并没有prod_id这个字段,所以这里在第2段代码加上了cross apply随便取出一个产品的id,这样就有prod_id这个字段,可以合并了。

修改之后,果然速度降到了10多秒。

以上是"sql中如何将full join改为left join +union all"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

代码 办法 数据 运行 内容 字段 就是 服务器 篇文章 语句 尝试 服务 原始 特殊 再进一步 业务 产品 价值 兴趣 再次 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 江苏根荣互联网科技 科技互联网政务服务 与互联网科技公司 互联网 科技 互联网 的科技创新 致骋互联网科技 互联网科技媒体 成都狮子座互联网科技 央行互联网金融科技公司 互联网科技和信息 浙南科技城互联网大厦建设工程 河南住房之家互联网科技 互联网公司黑科技创始人 广州千川互联网科技有限公司 互联网科技股为什么大涨 35岁以上互联网科技行业 江苏互联网科技小贷 互联网科技平台产品运营 上海万顺科技互联网有限公司招聘 求路客互联网科技电话 广州大一互联网络科技有限公司 深圳恒合互联网络科技有限公司 小马过河互联网科技 盛创互联网科技有限公司 四川慕妮娅互联网科技有限公司 中科明德北京互联网科技 广州富喜互联网络科技 有人说阿里系是互联网科技企业 互联网高科技行业有哪些企业 互联网科技手抄报图片
0