SQL计算两个SUM结果差值时出现1064语法错误如何解决
错误原因
触发1064语法错误的核心原因是子查询的子句顺序不符合SQL语法规则:
- SQL的SELECT查询有固定的书写顺序要求,必须遵循
SELECT [计算逻辑/字段] FROM [表名] WHERE [过滤条件]的结构。你编写的两个子查询都把FROM表声明放在了WHERE过滤条件之后,数据库解析到WHERE关键词时无法匹配到对应的查询表,直接抛出语法异常,和错误提示里标注的出错位置完全吻合。 - 额外注意:
CURDATE()是MariaDB内置函数,函数名和后续括号之间不要加多余空格,虽然部分版本会兼容这种写法,但容易触发不必要的解析问题。
修正方案
写法1:保留原有子查询做差逻辑,仅修正语法顺序
调整两个子查询里FROM和WHERE的位置即可正常执行,建议给计算结果加别名方便读取:
SELECT ( (SELECT SUM(`amount`) FROM `plugin_reward_aggregated` WHERE `reward_user_id` = 89) - (SELECT SUM(`amount`) FROM `plugin_reward_aggregated` WHERE `download_date` >= CURDATE()) ) AS amount_diff;
写法2:单表条件聚合(性能更优)
两次求和都来自同一张表,可以通过条件聚合一次遍历表就计算出结果,避免两次扫描表数据,数据量大时性能提升明显:
SELECT SUM(CASE WHEN `reward_user_id` = 89 THEN `amount` ELSE 0 END) - SUM(CASE WHEN `download_date` >= CURDATE() THEN `amount` ELSE 0 END) AS amount_diff FROM `plugin_reward_aggregated`;
补充:如果过滤条件没有匹配到任何记录,
SUM()函数会返回NULL,NULL参与算术运算的最终结果也是NULL。如果需要把无匹配记录的场景按求和值为0处理,可以给SUM函数套一层COALESCE(SUM(xxx), 0)将NULL转为0再计算。
内容的提问来源于stack exchange,提问作者Winie
相关产品推荐
相关产品推荐

