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
相关产品推荐
相关产品推荐

