sql中如何将full join改为left join +union all
发表于:2025-11-13 作者:千家信息网编辑
千家信息网最后更新 2025年11月13日,这篇文章主要介绍sql中如何将full join改为left join +union all,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!今天收到一个需求,要改写一个报表的逻辑
千家信息网最后更新 2025年11月13日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安全错误
数据库的锁怎样保障安全
峡江软件开发项目管理
软件开发要要游戏本吗
idea能不能搞数据库
数据库证件乱码如何解决
软件开发年度总结
数据库查询所有学生选课记录
数据库多副本不停机更新
广东鲲鹏服务器单价
世界大学数据库
java实时无限查询数据库
数据库的表设计器显示只读
5g网络技术 小说
网络安全人员的职业道德
软件开发培训哪个好点
检测数据库是否安装
怎么自己建立服务器
外卖订餐数据库
地平线5多人游戏服务器
直播间数据库
浪潮塔式服务器售后服务
服务器7800瓦用多大的电源
获取服务器的路径问题
驱动器上位机软件开发
数据库分页 数据修改
幼儿园网络技术工作室计划
录播服务器价格
荥阳市法院网络安全
软件开发定制预算
服务器意外断电后数据一定会丢失
山东华信网络技术有限公司