如何查询未关联用户sashan的学校?现有SQL优化咨询
优化查询:找出用户
sashan未关联的学校 嘿,针对你的需求,我整理了几种比原SQL更简洁高效的实现方式,咱们一步步来看:
原SQL的问题点
你的原查询虽然能得到正确结果,但通过两次左连接再过滤的方式,逻辑上有点绕,而且可能会带来不必要的性能开销——毕竟你只关心sashan这个特定用户的关联情况,不需要把所有用户都卷进来。
方案1:使用NOT EXISTS(推荐,性能更优)
这种方式逻辑最清晰,而且数据库的查询优化器通常会给NOT EXISTS生成高效的执行计划(一旦找到匹配的关联记录就停止查找):
SELECT s.* FROM School s WHERE NOT EXISTS ( SELECT 1 FROM Student st JOIN AppUser au ON st.UserId = au.id WHERE au.name = 'sashan' AND st.SchoolId = s.Id );
逻辑说明:直接检查每一所学校,是否不存在sashan对应的学生关联记录,不存在就返回该学校。
方案2:子查询过滤关联学校后左连接
先通过子查询找出sashan已经关联的所有学校ID,再用左连接筛选出不在这个列表里的学校:
SELECT s.* FROM School s LEFT JOIN ( SELECT st.SchoolId FROM Student st JOIN AppUser au ON st.UserId = au.id WHERE au.name = 'sashan' ) st_assoc ON s.Id = st_assoc.SchoolId WHERE st_assoc.SchoolId IS NULL;
逻辑说明:子查询先拿到sashan的关联学校集合,再用左连接找到没有匹配上的学校,结果和需求完全一致,写法也很直观。
方案3:使用NOT IN(简洁但注意边界情况)
如果你的数据里Student.UserId和AppUser.id都不会出现NULL值,这种写法最简洁:
SELECT s.* FROM School s WHERE s.Id NOT IN ( SELECT st.SchoolId FROM Student st JOIN AppUser au ON st.UserId = au.id WHERE au.name = 'sashan' );
注意:如果子查询的结果里出现NULL,NOT IN会返回空结果,所以只有当你确定关联字段都是非空的时候,才推荐用这种写法。
这几种方案都能精准满足你的需求,而且相比原SQL,逻辑更聚焦,性能也更出色。
内容的提问来源于stack exchange,提问作者sashang
相关产品推荐
相关产品推荐

