可以对以上SQL语句进行如下优化:

  1. 使用表别名简化SQL语句的可读性。
  2. 将子查询中的LEFT JOIN改为INNER JOIN,因为在主查询中已经使用了LEFT JOIN,所以子查询中可以使用INNER JOIN来过滤数据,减少不必要的记录。
  3. 将子查询中的GROUP BY去掉,将聚合函数的计算移到主查询中。
  4. 将子查询中的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值。
  5. 将主查询中的LEFT JOIN改为INNER JOIN,因为在子查询中已经过滤了数据,所以主查询中可以使用INNER JOIN来进一步减少不必要的记录。
  6. 将主查询中的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

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

原文地址: https://www.cveoy.top/t/topic/ikOL 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录