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

H2数据库:如何将两个查询合并为单个查询

筛选未选修特定课程的用户的正确SQL写法

嘿,我来帮你搞定这个问题~你要找没选修特定课程的用户,原来的写法在SQL语法上是行不通的,咱们换两种更靠谱的单查询方式来实现:

方法1:LEFT JOIN + IS NULL(推荐,性能友好)

这种方法通过左连接用户表和筛选了目标课程的选课记录表,找到那些没有匹配选课记录的用户(包括完全没选任何课的用户):

SELECT u.ID, u.NAME, u.LASTNAME, u.ROLE
FROM USERS u
LEFT JOIN COURSERELATION cr 
    ON u.ID = cr.ID_USER 
    AND cr.ID_COURSE = ?  -- 这里替换成你要排除的课程ID
WHERE cr.ID_USER IS NULL;

逻辑说明:左连接会保留所有用户记录,只有选过目标课程的用户会匹配到COURSERELATION的记录,WHERE cr.ID_USER IS NULL就筛选出了那些没选过该课程的用户。

方法2:NOT EXISTS子查询(逻辑更直观)

用子查询检查用户是否存在选目标课程的记录,不存在则返回该用户:

SELECT u.ID, u.NAME, u.LASTNAME, u.ROLE
FROM USERS u
WHERE NOT EXISTS (
    SELECT 1
    FROM COURSERELATION cr
    WHERE cr.ID_USER = u.ID 
      AND cr.ID_COURSE = ?  -- 替换为目标课程ID
);

逻辑说明:对于每个用户,子查询会验证他是否选过指定课程,如果没找到对应记录,NOT EXISTS就会返回true,这个用户就会被筛选出来。

额外说明

如果你只想筛选选过其他课程但没选目标课程的用户(排除完全没选课的用户),可以在方法1的基础上添加一个条件:

SELECT u.ID, u.NAME, u.LASTNAME, u.ROLE
FROM USERS u
LEFT JOIN COURSERELATION cr_target 
    ON u.ID = cr_target.ID_USER 
    AND cr_target.ID_COURSE = ?
JOIN COURSERELATION cr_any 
    ON u.ID = cr_any.ID_USER
WHERE cr_target.ID_USER IS NULL;

内容的提问来源于stack exchange,提问作者Sande

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:23:21