如何在SELECT查询中无需二次扫表和WITH子句获取每行的SUM值
解决每行显示全局总和且避免多次扫描的问题
针对你想要在每行返回对应字段的同时,显示整个表value列的总和,又不想进行多次表扫描的需求,这里有个兼容Android 5及更早版本的高效方案:
推荐查询语句
SELECT p.id, p.value, s.total_sum FROM product p CROSS JOIN (SELECT SUM(value) AS total_sum FROM product) s;
为什么这个方案可行?
- 子查询
(SELECT SUM(value) AS total_sum FROM product)只会执行一次,一次性计算出整个表的value总和,避免了每行重复执行SUM的低效操作(也就是你之前用(SELECT SUM(value) FROM product)作为列值时的二次/多次扫描问题)。 - 通过
CROSS JOIN将原表的每一行与这个总和结果进行笛卡尔连接,这样每一行都会带上全局总和,完美匹配你想要的输出:id value total_sum 1 10 60 2 20 60 3 30 60
对比你尝试过的方法
- 直接执行
SELECT id, value, SUM(value) as total FROM product:因为没有指定GROUP BY,聚合函数SUM会将整个表合并为一行返回,所以只能得到单一结果行,不符合需求。 - 行内子查询方案:
SELECT id, value, (SELECT SUM(value) FROM product) as total FROM product:这个查询会逐行执行子查询,相当于对表进行N次扫描(N为表的行数),效率极低。 WITH子句方案:虽然逻辑清晰,但Android 5及更早版本搭载的SQLite版本不支持公共表表达式(CTE),所以无法兼容低版本系统。
内容的提问来源于stack exchange,提问作者Busata
相关产品推荐
相关产品推荐

