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

如何筛选关联表全满足指定值的SQL数据?含导师实习生场景

SQL筛选问题解答

嘿,我来帮你搞定这两个筛选需求,两种实用思路都给你列出来,你可以根据自己的表结构和实际需求选合适的!

问题1:从表A筛选出关联表B所有对应行值均为X的条目

核心思路是排除掉那些存在关联表B行值不为X的表A记录,剩下的就是所有关联B行都符合条件的A条目。这里给你两种常用实现方式:

方法1:使用NOT EXISTS子查询

这种方式逻辑清晰,性能也不错,适合大多数场景:

SELECT a.*
FROM 表A a
WHERE NOT EXISTS (
    -- 找表A中存在至少一个关联表B行值不为X的情况
    SELECT 1
    FROM 表B b
    WHERE b.关联字段 = a.关联字段 -- 替换成你实际的表关联字段(比如a.id = b.a_id)
      AND b.目标字段 != 'X' -- 替换成要检查的字段和目标值X
);

方法2:使用LEFT JOIN + WHERE过滤

通过左连接找到不符合条件的行,再过滤掉这些匹配项:

SELECT DISTINCT a.*
FROM 表A a
LEFT JOIN 表B b 
  ON b.关联字段 = a.关联字段 
  AND b.目标字段 != 'X' -- 提前筛选不符合条件的B行
WHERE b.表B主键 IS NULL; -- 没有匹配到不符合条件的B行,说明所有关联B行都是X

问题2:筛选所有实习生Practice_result.Mark均为5的导师姓名

基于你给出的表关联关系,同样用排除法或者分组聚合的方式来实现:

方法1:NOT EXISTS子查询(推荐,逻辑直观)

SELECT m.l_name, m.f_name
FROM mentors m
WHERE NOT EXISTS (
    -- 找到该导师下存在至少一个实习生成绩不是5的情况
    SELECT 1
    FROM interns_specialty isp
    JOIN interns i ON i.intern_id = isp.intern_id
    JOIN Practice_result pr ON pr.intern_id = i.intern_id -- 假设成绩表和实习生用intern_id关联,根据实际调整
    WHERE isp.mentor_id = m.mentor_id
      AND pr.Mark != 5
);

方法2:分组聚合(适合需要确认所有实习生都有成绩的场景)

如果要求导师的所有实习生必须有成绩且都是5,可以用分组后检查最值:

SELECT m.l_name, m.f_name
FROM mentors m
JOIN interns_specialty isp ON m.mentor_id = isp.mentor_id
JOIN interns i ON i.intern_id = isp.intern_id
JOIN Practice_result pr ON pr.intern_id = i.intern_id
GROUP BY m.mentor_id, m.l_name, m.f_name
-- 所有成绩的最小值和最大值都是5,说明全部成绩都是5
HAVING MIN(pr.Mark) = 5 AND MAX(pr.Mark) = 5;

⚠️ 注意:如果有实习生没有对应的Practice_result记录(即没成绩),第二种方法会自动排除这类导师,因为JOIN会过滤掉无成绩的实习生;如果需要包含“实习生没成绩但现有成绩都是5”的导师,得把JOIN改成LEFT JOIN,再调整HAVING条件处理NULL值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:19:20