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

如何查询未关联用户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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:17:30