数据库中如何使用LEFT JOIN优化多个子查询
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,小编给大家分享一下数据库中如何使用LEFT JOIN优化多个子查询,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1.SQL
千家信息网最后更新 2024年09月22日数据库中如何使用LEFT JOIN优化多个子查询
小编给大家分享一下数据库中如何使用LEFT JOIN优化多个子查询,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
1.SQL1
OLD:
SELECT COUNT (1) num FROM ( SELECT t1.* FROM t_asset t1 WHERE 1 = 1 AND t1.TYPE = 0 AND ( t1.status IN (1, 10, 11, 12, 100) OR (EXISTS (SELECT b.resource_id FROM t_asset_file b WHERE t1.resource_id = b.asset_code AND t1.status IN (3, 4, 8) AND b.status IN (1, 10, 11, 12)))) AND ( EXISTS (SELECT 1 FROM t_asset_file a1 WHERE t1.resource_id = a1.asset_code AND ( a1.content_status = 1 OR a1.content_status = 4)) OR NOT EXISTS (SELECT 1 FROM t_asset_file a1 WHERE t1.resource_id = a1.asset_code)) ORDER BY t1.create_time DESC, t1.resource_id) a;
优化方向: 合并多个t_asset_file子查询
优化方法: 使用left join 来代替子查询,把关联列放在group by中,将子查询中不同条件使用case when
SELECT COUNT (1) num FROM ( SELECT t1.* FROM t_asset t1, ( SELECT asset_code, MAX (CASE WHEN status IN (1, 10, 11, 12) THEN 1 ELSE 0 END) status, MAX ( CASE WHEN content_status = 1 OR content_status = 4 THEN 1 ELSE 0 END) content_status FROM t_asset_file GROUP BY asset_code) t2 WHERE t1.resource_id = t2.asset_code(+) AND t1.TYPE = 0 AND ( t1.status IN (1, 10, 11, 12, 100) OR (t1.status IN (3, 4, 8) AND t2.status(+) = 1)) AND ( (t2.content_status(+) = 1) OR (t2.asset_code IS NULL)) ORDER BY t1.create_time DESC, t1.resource_id) a;
2.SQL2
OLD:
SELECT m.khbh, d.wzzbm, wmsys.wm_concat (m.rkid) rkids FROM m@dblink m, d@dblink d WHERE m.rkid = d.rkid AND m.rkzt = 2 AND m.ssny < '201311' AND m.zxdid IS NULL AND ( NOT EXISTS (SELECT 1 FROM m@dblink m1, d@dblink d1 WHERE m1.rkid = d1.rkid AND m1.zxdid = m.rkid AND d1.wzzbm = d.wzzbm AND m1.rkzt = 3) OR (SELECT SUM (d1.xysl) FROM m@dblink m1, d@dblink d1 WHERE m1.rkid = d1.rkid AND m1.zxdid = m.rkid AND d1.wzzbm = d.wzzbm AND m1.rkzt = 3) < d.xysl)GROUP BY m.khbh, d.wzzbm;
优化方向:合并重复的子查询
SELECT m.khbh, d.wzzbm, wmsys.wm_concat (m.rkid) rkids FROM m@dblink m, d@dblink d, (select m1.zxdid,d1.wzzbm, sum(d1.xysl) sum_xysl from m@dblink m1,d@dblink d1 where m1.rkzt = 3 and m1.rkid = d1.rkid group by m1.zxdid,d1.wzzbm) z WHERE m.rkid = d.rkid AND m.rkzt = 2 AND m.ssny < '201311' AND m.zxdid IS NULL and z.zxdid=m.rkid and z.wzzbm=d.wzzbm AND ( (z.zxdid is null and z.wzzbm is null) OR z.sum_xysl < d.xysl)GROUP BY m.khbh, d.wzzbm;
3.SQL3
OLD:
select m.col1,d.col2,wmsys.wm_concat(m.col3) col3sfrom m,dwhere m.col3=d.col3and m.col6=2and m.col7<'201312'and m.col4 is nulland (not exists (select 1 from m m1,d d1 where m1.col3=d1.col3 and m1.col4=m.col3 and d1.col2=d.col2 and m1.col7< '201312' and m1.col6=3) or (select sum(d1.col5) from m m1,d d1 where m1.col3=d1.col3 and m1.col4=m.col3 and d1.col2=d.col2 and m1.col7<'201312' and m1.col6=3)优化方向:
(1).主查询和子查询涉及表相同,并且条件有很多共同点,可以考虑合并。
(2).子查询结构相似,考虑使用left join来进行合并。
NEW:
with aa as(select m.col1,d.col2,m.col3,m.col4,d1.col5 from m,dwhere m.col3=d.col3and m.col6 in(2,3)and m1.col7< '201312')select aa.col1,aa.col2, wmsys.wm_concat(aa.col3) col3sfrom aa, (select col4,col2,sum(d1.col5) sum_col5 from aa where col6=3 group by col4,col2) bbwhere aa.col3=bb.col4(+)and aa.col2=bb.col2(+)and aa.col4 is nulland aa.col6=2and (bb.col4 is null or bb.sum_col5(+)以上是"数据库中如何使用LEFT JOIN优化多个子查询"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
查询
多个
方向
篇文章
数据
数据库
内容
条件
不同
相似
相同
不怎么
共同点
大部分
方法
更多
知识
结构
行业
资讯
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
火车票有打印服务器吗
sql数据库的递归循环
网络安全班会学习的心得
杭州讯诚网络技术
wps模板服务器繁忙
上海方便网络技术客户至上
数据库类型与版本
多租户的数据库设计
数据库机被淘汰
ssh连接服务器偶尔被拒绝
杭州趣的网络技术
网络安全于道德法规作文
哪个软件可以炒股软件开发
软件开发注册码
江苏网络安全应急指挥中心
爱玩网络技术有限公司怎么样
阿里云iot平台自建服务器
考辅警网络安全员有什么条件
安徽公安厅网络安全保卫总队
汉中市第5届国家网络安全宣传周
web服务器登录界面
sql数据库服务错误7031
龙源网与龙源数据库
网络安全法草案二审稿
软件开发框架什么意思
中兴软件开发岗位用什么语言
网络安全于道德法规作文
网络安全需要码代码吗
网络安全四梁八柱是什么
软件开发能力怎么证明