直接加法(1+1)与SUM聚合函数的差异及性能准确性疑问
直接加法与SUM聚合函数的区别及SQL查询写法疑问
我想搞清楚直接加法(比如1 + 1)和聚合函数SUM(1 + 1)之间的区别。另外,我写了一段计算用户声誉值的SQL语句,采用直接加法组合多个聚合结果,想确认这种写法会不会有性能问题,或者导致计算结果出错——目前测试负值情况结果正常,但还是担心有遗漏场景。
以下是我用直接加法实现的查询语句:
SELECT "User"."id", "User"."name", "User"."title", "User"."about", "User"."location", "User"."isModerator", "User"."createdAt", ( -- 问题投票得分 COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NULL), 0)::int + COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NULL), 0)::int + -- 回答投票得分 COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NOT NULL), 0)::int + COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NOT NULL), 0)::int + -- 被采纳回答得分 (COALESCE(COUNT("answer"."id"), 0)::int * 15) ) as reputation FROM "User" LEFT JOIN "Post" ON "Post"."authorId" = "User"."id" LEFT JOIN "PostVote" ON "PostVote"."postId" = "Post"."id" LEFT JOIN "Post" as answer ON "Post"."acceptedAnswerId" = "answer"."id" GROUP BY "User"."id" ORDER BY reputation DESC, id
我之所以这么写,是因为SUM函数不能嵌套使用——原本我想写成下面这种形式,但显然不可行:
-- ... SUM( -- 问题投票得分 COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NULL), 0)::int + COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NULL), 0)::int + -- 回答投票得分 COALESCE(SUM("PostVote"."value" * 10) FILTER (WHERE "value" = 1 AND "Post"."questionId" IS NOT NULL), 0)::int + COALESCE(SUM("PostVote"."value" * 2) FILTER (WHERE "value" = -1 AND "Post"."questionId" IS NOT NULL), 0)::int + -- 被采纳回答得分 (COALESCE(COUNT("answer"."id"), 0)::int * 15) ) as reputation -- ...
我知道可以用嵌套查询来实现外层SUM,但觉得这种写法太繁琐,所以想确认当前直接加法的写法是否可靠,有没有潜在问题?
内容的提问来源于stack exchange,提问作者R.M. Reza
相关产品推荐
相关产品推荐

