SQL Server 2016查询如何包含无成绩的指定grade_items行?
解决方案:显示所有指定grade_items的成绩(含无成绩项)
你的问题核心是原来的INNER JOIN会过滤掉没有匹配成绩记录的行,所以要调整连接方式,确保所有指定的gi.idnumber都能出现在结果里。这里有两种靠谱的实现方式:
方式一:基于grade_items筛选目标code(推荐)
这种方式直接从grade_items表中筛选你需要的code,然后左连接成绩表,确保所有目标code都被保留:
SELECT u.idnumber, gi.idnumber AS code, gg.finalgrade AS grade FROM grade_items AS gi -- 关联指定用户,因为我们只需要这个用户的数据 INNER JOIN users AS u ON u.idnumber = 'JohnBrown-xyz123' -- 左连接成绩表:即使没有对应成绩,也会保留gi的行 LEFT JOIN grade_grades AS gg ON gi.id = gg.itemid AND gg.userid = u.id WHERE gi.idnumber IN ('436','434','313','002','135') -- 按code排序,和你期望的结果顺序一致 ORDER BY gi.idnumber;
方式二:手动构造目标code列表
如果你需要确保某些code即使不在grade_items中也能显示(比如未来可能新增的code),可以用VALUES子句手动生成目标code集合:
SELECT u.idnumber, target_codes.code, gg.finalgrade AS grade FROM -- 手动列出所有需要的code (VALUES ('436'), ('434'), ('313'), ('002'), ('135')) AS target_codes(code) -- 关联grade_items验证code的有效性(不需要的话可以去掉这行) INNER JOIN grade_items AS gi ON target_codes.code = gi.idnumber INNER JOIN users AS u ON u.idnumber = 'JohnBrown-xyz123' LEFT JOIN grade_grades AS gg ON gi.id = gg.itemid AND gg.userid = u.id ORDER BY target_codes.code;
为什么原来的查询不行?
你之前用的是INNER JOIN,这种连接方式要求所有关联的表都有匹配的行才会返回结果。如果某个gi.idnumber没有对应的成绩记录(也就是grade_grades里没有该行),整个组合就会被过滤掉,所以只返回了有成绩的两行。
而LEFT JOIN会保留左表(这里是grade_items或者target_codes)的所有行,右表(grade_grades)没有匹配的话,对应列就会显示为NULL(也就是你期望的空值)。
内容的提问来源于stack exchange,提问作者luisdev
相关产品推荐
相关产品推荐

