2 sinat 33460472 sinat_33460472 于 2018.08.10 17:32 提问

SQL写的太长,效率不高,查询问题优化 5C
sql

经理说,下面这个SQL可读性太差了,让我改改,看的我一脸懵逼,麻烦大神帮我改改。
SELECT YBB.JGBJLIST_CPMC AS CPMC,
YBB.{0} AS YBBJG,
MBBB.{0} AS MBBBJG,
YBB.JGBJLIST_CPID,
YBB.JGBJLIST_PARENTID,
(MBBB.{0}-YBB.{0}) as JDC,
case when YBB.{0}=0 then '0%' else round(((MBBB.{0}-YBB.{0})/YBB.{0})*100,2) ||'%' end as XDC
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID =:YBBID
AND MBBB.JGBJLIST_BJBBID =:MBBBID
UNION ALL
SELECT BJ.JGBJLIST_CPMC AS CPMC, BJ.{0} AS YBBJG, null AS MBBBJG,BJ.JGBJLIST_CPID,
BJ.JGBJLIST_PARENTID,
(0-BJ.{0}) as JDC,
case when BJ.{0}=0 then '0%' else round(((0-BJ.{0})/BJ.{0})*100,2) ||'%' end as XDC
FROM JGBJLIST BJ
WHERE BJ.JGBJLIST_CPID NOT IN
(SELECT YBB.JGBJLIST_CPID
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID =:YBBID
AND MBBB.JGBJLIST_BJBBID =:MBBBID )
AND JGBJLIST_BJBBID =:YBBID
UNION ALL
SELECT BJ.JGBJLIST_CPMC AS CPMC, null AS YBBJG, BJ.{0} AS MBBBJG,BJ.JGBJLIST_CPID,
BJ.JGBJLIST_PARENTID,
(BJ.{0}-0) as JDC,
'0%'as XDC
FROM JGBJLIST BJ
WHERE BJ.JGBJLIST_CPID NOT IN
(SELECT YBB.JGBJLIST_CPID
FROM JGBJLIST YBB
LEFT JOIN JGBJLIST MBBB
ON YBB.JGBJLIST_CPID = MBBB.JGBJLIST_CPID
WHERE YBB.JGBJLIST_BJBBID = :YBBID
AND MBBB.JGBJLIST_BJBBID = :MBBBID )
AND JGBJLIST_BJBBID =:MBBBID

9个回答

devmiao
devmiao   Ds   Rxr 2018.08.10 23:11
u010012710
u010012710   2018.08.12 01:32

不考虑存储效率的话,可以考虑建新表,多表关联的方式,这样可以加强可读性。

weixin_42667770
weixin_42667770   2018.08.12 16:14

把公用表先查询,做成临时表或者变量表,每张表注释好,然后在这些表的基础上再做二次查询,这样可读性就能大幅提升

niaonao
niaonao   Rxr 2018.08.13 09:28

拆分SQL
中间表
使用业务处理SQL的业务

hometing218
hometing218   2018.08.13 09:34

可以先把带有的查询条件的查出来,剩余的一些需要字段可以额外在重新查一次

Life_s
Life_s   2018.08.13 11:25

可以考虑建新表,多表关联

I08002726
I08002726   2018.08.14 22:53

业务拆分、写子查询。

u014437234
u014437234   2018.08.11 09:18

在写sql时,尽量避免参数在数据库端进行运算,尽量将计算逻辑放到程序中去处理;
case when 看下能不能去掉
not in 中的数据 能否直接传入,不要直接去查询
避免过多的子查询,希望能帮到你

zhaomin_g
zhaomin_g   2018.08.11 12:35

业务太复杂建议使用存储过程

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Hibernate之查询效率问题
相信越来越多的web开发者,在持久层都采用了hibernate。都说hibernate效率高,可是当整个项目下来后发现,比 其他持久层版本慢很多,当然功能也多很多。记得当初同事测试hibernate销率时,在100万数据量的情况下,hibernate的效率 几乎接近于jdbc,那么为什么如今很多公司的项目运行那么慢呢(不仅仅是hibernate),也许有些细节上的东西我们开发人员没有注意。
mybatis SQL性能调优
Mybatis SQL性能调优         1.  Mapper层参数为Map,由Service层负责重载       Mapper由于机制的问题,不能重载,参数一般设置成Map,但这样会使参数变得模糊,如果想要使代码变得清晰,可以通过service层来实现重载的目的,对外提供的Service层是重载的,但这些重载的Service方法其实是调同一个Mapper,只不过相应的参数并
MySQL的in查询效率太低的解决办法之一与其它优化示例
最近在做一个MySQL数据库的查询(查询出指定时间之后凡是上传过图片的用户所在的镇和镇的管理员名),查询语句如下:  SELECT DISTINCT user_name,town_name FROM t_farmers WHERE id IN  (SELECT DISTINCT farmer_id FROM t_farmers_images WHERE create_time>='2017
Sql中EXISTS与IN的效率问题
根据两张表大小不同选择EXSIST、IN
sql优化----不同写法下group by 的影响
今天要对实现这样的一个统计效果的sql进行优化。 分析:可以看出此统计是要求针对经销商,车系两个维度对试驾次数和潜客数两个指标进行统计,试驾率是由这两个指标进行计算而得到。 1、维度:经销商,车系 2、指标:试驾次数,潜客数 原版sql如下: 分析问题:此sql给人的第一印象就是用了子查询效率低,事实它确实特别慢。而且对于不熟悉业务的人来说想看懂很痛苦。     所以我选择了重
常见sql语句效率优化方式
数据库sql优化
要提高SQL查询效率where语句条件的先后次序应如何写使你的SQL 语句完全优化
我们要做到不但会写SQL,还要做到写出性能优良的SQL语句。 (1)选择最有效率的表名顺序(只在基于规则的优化器中有效): Oracle的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择
【SQL】—Oracle之row_number()与rownum效率大比拼
取前面11条数据的时间:rownum<row_number() 取后面11条数据的时间:rownum<row_number() rownum:取前面11条数据的时间<取后面11条数据的时间 row_number():取前面11条数据的时间<取后面11条数据的时间 相对取出11条数据(无论前后),rownum比row_number()大概节省一半的时间。 Ok,这就是对比的结果,看来,经典的分页查询,通过rownum还是很有道理的。因为它比ro
SQL优化--Exists和in的效率哪个高
系统要求进行SQL优化,对效率比较低的SQL进行优化,使其运行效率更高,其中要求对SQL中的部分in/not in修改为exists/not exists   修改方法如下: in的SQL语句 SELECT id, category_id, htmlfile, title, convert(varchar(20),begintime,112) as pubtime FRO
left join查询优化
SQL查询优化 LEFT JOIN和INNER JOIN: 1, 连接了八个数据库表,而且全部使用LEFT JOIN,如下所示: Resource_Resources A LEFT JOIN Resource_Clients B ON A.ResourceId = B.ResourceId   LEFT JOIN Resource_Files C on B.ClientId=C.Clie