SQL查询无匹配行时如何返回用户信息并将总分数设为默认值0
问题核心原因
原SQL存在三处核心问题导致无成绩的用户无法返回预期结果:
- 关联逻辑错误,未正确引入CourseMarks表就直接在JOIN条件中使用该表字段,同时错误使用内连接,会直接过滤掉无匹配成绩的用户
- 将CourseMarks表的过滤条件放在WHERE子句中,进一步过滤了无成绩的用户记录
- 未处理空值,无成绩时SUM聚合结果为NULL,不会自动转为0
修正后的SQL语句
SELECT User.Name AS UserName, User.Id AS UserId, CourseMarks.Id AS CourseId, COALESCE(SUM(CourseMarks.Marks), 0) AS "Total marks" FROM User LEFT JOIN CourseMarks ON User.Id = CourseMarks.User_Id AND CourseMarks.User_Id = 2 -- 若需要关联Tutors表请使用以下正确关联逻辑,原SQL关联条件有误 -- LEFT JOIN Tutors ON User.TutorId = Tutors.Id WHERE User.Id = 2 GROUP BY User.Id, User.Name, CourseMarks.Id
如果不需要展示CourseId,可去掉SELECT和GROUP BY中的CourseMarks.Id字段,无成绩时只会返回一行Total marks为0的记录,完全符合预期。如果需要查询全量用户的成绩数据,去掉WHERE子句的User.Id = 2过滤,以及LEFT JOIN ON中的CourseMarks.User_Id = 2条件即可。
关键修改说明
- 改用
LEFT JOIN关联CourseMarks表,保留User表的所有符合条件的记录,哪怕右表没有匹配的成绩数据 - 将
CourseMarks.User_Id = 2的过滤条件移到LEFT JOIN的ON子句中,避免无成绩的用户被过滤 - 用
COALESCE函数处理SUM的结果,无成绩时SUM返回的NULL会被转为默认值0 - 修正了原SQL中Tutors表的错误关联逻辑,如需用到Tutors表字段可使用注释中的正确关联写法
内容的提问来源于stack exchange,提问作者Illep
相关产品推荐
相关产品推荐

