如何筛选关联表全满足指定值的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
相关产品推荐
相关产品推荐

