You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:19:06