select x sumbm9 as bm9 sumbm1 as bm1 sumbm2 as bm2 sumbm3 as bm3 sumbm4 as bm4 sumbm5 as bm5 sumbm6 as bm6 sumbm7 as bm7 sumbm8 as bm8 from select xC_NAME yC_ID yC_STATUS sumzm9 as m9
可以对以上SQL语句进行如下优化:
- 使用表别名简化SQL语句的可读性。
- 将子查询中的LEFT JOIN改为INNER JOIN,因为在主查询中已经使用了LEFT JOIN,所以子查询中可以使用INNER JOIN来过滤数据,减少不必要的记录。
- 将子查询中的GROUP BY去掉,将聚合函数的计算移到主查询中。
- 将子查询中的SUM函数中的z.m9, z.m1, z.m2, z.m3, z.m4, z.m5, z.m6, z.m7, z.m8改为COALESCE(SUM(z.m9), 0), COALESCE(SUM(z.m1), 0), ...,以避免出现NULL值。
- 将主查询中的LEFT JOIN改为INNER JOIN,因为在子查询中已经过滤了数据,所以主查询中可以使用INNER JOIN来进一步减少不必要的记录。
- 将主查询中的GROUP BY去掉,将聚合函数的计算移到子查询中。
优化后的SQL语句如下:
SELECT x.*, COALESCE(SUM(b.m9), 0) AS bm9, COALESCE(SUM(b.m1), 0) AS bm1, COALESCE(SUM(b.m2), 0) AS bm2, COALESCE(SUM(b.m3), 0) AS bm3, COALESCE(SUM(b.m4), 0) AS bm4, COALESCE(SUM(b.m5), 0) AS bm5, COALESCE(SUM(b.m6), 0) AS bm6, COALESCE(SUM(b.m7), 0) AS bm7, COALESCE(SUM(b.m8), 0) AS bm8 FROM ( SELECT x.C_NAME, y.C_ID, y.C_STATUS, COALESCE(SUM(z.m9), 0) AS m9, COALESCE(SUM(z.m1), 0) AS m1, COALESCE(SUM(z.m2), 0) AS m2, COALESCE(SUM(z.m3), 0) AS m3, COALESCE(SUM(z.m4), 0) AS m4, COALESCE(SUM(z.m5), 0) AS m5, COALESCE(SUM(z.m6), 0) AS m6, COALESCE(SUM(z.m7), 0) AS m7, COALESCE(SUM(z.m8), 0) AS m8, x.C_ID AS C_IDS FROM db_twenty.t_place x INNER JOIN db_twenty.t_projectreportbatch y ON (x.C_ID = y.R_PLACE_ID AND y.R_STATEMENT_ID = 47) LEFT JOIN db_twenty.t_projectreports z ON (x.C_ID = z.C_TOWID AND z.R_STATEMENT_ID = 47 AND z.C_DELETED = 0) WHERE x.R_PARENT_ID = 441424000000 AND x.C_DELETED = 0 GROUP BY x.C_ID ) x INNER JOIN db_twenty.t_projectreports b ON (x.C_IDS = b.C_TOWID AND b.C_ANNUAL * 100 + b.C_PERIOD <= 202305 AND b.C_DELETED = 0) GROUP BY x.C_ID
原文地址: https://www.cveoy.top/t/topic/ikOL 著作权归作者所有。请勿转载和采集!