基于给定表结构,如何查询同时在IT和SE部门的员工姓名?
查询同时在IT和SE部门的员工姓名的SQL解法
嘿,这个需求挺常见的,给你分享几种实用的SQL写法,你可以根据自己的数据库情况选最顺手的:
方法一:GROUP BY + HAVING(最通用的写法)
这种方法适配大多数场景,逻辑清晰还能避免重复数据的干扰:
SELECT e.sname FROM Emp e JOIN Dep d ON e.sid = d.sid WHERE d.dep IN ('IT', 'SE') GROUP BY e.sid, e.sname HAVING COUNT(DISTINCT d.dep) = 2;
这里用COUNT(DISTINCT d.dep)是为了防止同一个员工在同一个部门有多条重复记录的情况,要是你能确定Dep表不会出现这种重复,换成COUNT(*)也没问题,性能会稍好一点。
方法二:多表JOIN(逻辑直观)
如果需要筛选的部门数量不多,这种写法读起来特别明白,一眼就能看出是找同时存在两个部门关联的员工:
SELECT e.sname FROM Emp e JOIN Dep d1 ON e.sid = d1.sid AND d1.dep = 'IT' JOIN Dep d2 ON e.sid = d2.sid AND d2.dep = 'SE';
不过要是以后要加更多部门筛选条件,就得继续追加JOIN语句,会有点繁琐。
方法三:EXISTS子查询(性能友好)
如果你的Dep表在sid和dep字段上建了索引,这种写法的查询性能会很不错,而且逻辑也非常清晰:
SELECT e.sname FROM Emp e WHERE EXISTS ( SELECT 1 FROM Dep d WHERE d.sid = e.sid AND d.dep = 'IT' ) AND EXISTS ( SELECT 1 FROM Dep d WHERE d.sid = e.sid AND d.dep = 'SE' );
它的核心思路就是逐个校验员工是否同时存在IT和SE部门的关联记录。
内容的提问来源于stack exchange,提问作者Dananjaya
相关产品推荐
相关产品推荐

