怎么优化这条sql

<selectid="accountBalancelist"resultType="map">SELECTsmi.storeName,smi.storeNo,smi.uu... <select id="accountBalancelist" resultType="map"> SELECT smi.storeName, smi.storeNo, smi.uuid, smi.createOpeTime, CASE WHEN started.start_balance IS NULL THEN 0 ELSE started.start_balance END start_balance, CASE WHEN ended.end_balance IS NULL THEN 0 ELSE ended.end_balance END end_balance, CASE WHEN added.add_amount IS NULL THEN 0 ELSE added.add_amount END add_amount, CASE WHEN reduced.reduce_amount IS NULL THEN 0 ELSE reduced.reduce_amount END reduce_amount FROM store_main_info smi LEFT JOIN ( SELECT ca2.balance start_balance, ca1.crt, ca2.storeUuid FROM ( SELECT ca.storeUuid, MAX(ca.createOpeTime) crt FROM store_capital_virtual_account_detail ca WHERE ca.createOpeTime <#{starttime} GROUP BY ca.storeUuid ) ca1 LEFT JOIN store_capital_virtual_account_detail ca2 ON ca1.storeUuid = ca2.storeUuid AND ca1.crt = ca2.createOpeTime ) started ON smi.uuid = started.storeUuid LEFT JOIN ( SELECT ca2.balance end_balance, ca1.crt, ca2.storeUuid FROM ( SELECT ca.storeUuid, MAX(ca.createOpeTime) crt FROM store_capital_virtual_account_detail ca WHERE ca.createOpeTime <#{endtime} GROUP BY ca.storeUuid ) ca1 LEFT JOIN store_capital_virtual_account_detail ca2 ON ca1.storeUuid = ca2.storeUuid AND ca1.crt = ca2.createOpeTime ) ended ON smi.uuid = ended.storeUuid LEFT JOIN ( SELECT d.storeUuid, SUM(d.operAmount) add_amount FROM store_capital_virtual_account_detail d WHERE d.inOrOut = 1 AND d.createOpeTime BETWEEN #{starttime} AND #{endtime} GROUP BY d.storeUuid ) added ON smi.uuid = added.storeUuid LEFT JOIN ( SELECT d.storeUuid, SUM(d.operAmount) reduce_amount FROM store_capital_virtual_account_detail d WHERE d.createOpeTime BETWEEN #{starttime} AND #{endtime} AND d.inOrOut = 2 AND d.businessType != 52 GROUP BY d.storeUuid ) reduced ON smi.uuid = reduced.storeUuid where 1=1 <if test="storeName != null and storeName != ''"> and smi.storeName LIKE "%"#{storeName}"%" </if> <if test="storeNo != null and storeNo != ''"> and smi.storeNo LIKE "%"#{storeNo}"%" </if> <if test="offset != null and limit != null"> limit #{offset}, #{limit} </if> </select> 展开
 我来答
刀晓
2019-12-19 · TA获得超过377个赞
知道小有建树答主
回答量:1656
采纳率:72%
帮助的人:142万
展开全部
你贴上来的语句中,有两个ca1
修改如下:
SELECT smi.storeName, smi.storeNo, smi.uuid, smi.createOpeTime,
CASE WHEN started.start_balance IS NULL THEN 0 ELSE started.start_balance END start_balance,
CASE WHEN ended.end_balance IS NULL THEN 0 ELSE ended.end_balance END end_balance,
CASE WHEN added.add_amount IS NULL THEN 0 ELSE added.add_amount END add_amount,
CASE WHEN reduced.reduce_amount IS NULL THEN 0 ELSE reduced.reduce_amount END reduce_amount
FROM store_main_info smi
LEFT JOIN (SELECT ca2.balance start_balance,ca1.crt,ca2.storeUuid
FROM(SELECT ca.storeUuid, MAX(ca.createOpeTime) crt
FROM store_capital_virtual_account_detail ca
WHERE ca.createOpeTime <{starttime}
GROUP BY ca.storeUuid ) ca1 LEFT JOIN store_capital_virtual_account_detail ca2 ON ca1.storeUuid = ca2.storeUuid AND ca1.crt = ca2.createOpeTime ) ended ON smi.uuid = ended.storeUuid
LEFT JOIN ( SELECT d.storeUuid, SUM(d.operAmount) add_amount
FROM store_capital_virtual_account_detail d
WHERE d.inOrOut = 1 AND d.createOpeTime BETWEEN {starttime} AND {endtime} GROUP BY d.storeUuid )
added ON smi.uuid = added.storeUuid
LEFT JOIN ( SELECT d.storeUuid, SUM(d.operAmount) reduce_amount FROM store_capital_virtual_account_detail d
WHERE d.createOpeTime BETWEEN #{starttime} AND #{endtime} AND d.inOrOut = 2 AND d.businessType != 52 GROUP BY d.storeUuid ) reduced ON smi.uuid = reduced.storeUuid where 1=1
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
紫鸿青衣
2019-10-15 · 超过14用户采纳过TA的回答
知道答主
回答量:56
采纳率:0%
帮助的人:23.4万
展开全部
推荐方法:
1、搜索条件中有like的话,推荐使用 ‘xxx%’的方式,这样可以用上索引,而 ‘%xxx%’这种方式会进行全表扫描
2、将left join 在查询完store_main_info后根据uuid单独查询
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
沉绪员
2019-09-04 · TA获得超过132个赞
知道小有建树答主
回答量:242
采纳率:65%
帮助的人:39.9万
展开全部
我勒个去 能先优化一下表结构嘛?这字段多的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
jyvngshjj
2019-08-26 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:101
采纳率:33%
帮助的人:20万
展开全部
子查询有点多了,如果数量级比较大可能会影响效率其他的没看出什么了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式