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

https://blog.csdn.net/ado1986/article/details/47101527

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

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

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

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

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

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

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

业务拆分、写子查询。

考虑下写成函数?两个括号内侧select查询重复了。而且没太懂第2,3个select中的not in想做什么,逻辑是从JGBJLIST中选出CPID不在 [ JGBJLIST左结合 JGBJLIST ](为什么同一张表还要左结合)中的项,想从一张表中查询id不在这张表中的表项?这里的逻辑可以再考虑一下,其次就是楼上说的运算可以放在业务层进行。