如何不使用IN和子查询实现员工数超2的部门名称SQL查询?
问题:查询员工数量超过2人的部门名称(不使用IN关键字和子查询)
需求:查询员工数量超过2人的部门名称,不想使用IN关键字,且尚未学习子查询,寻求其他实现方案。
原参考答案(使用IN和子查询)
SELECT Name FROM Departments WHERE Code IN ( SELECT Department FROM Employees GROUP BY Department HAVING COUNT(*) > 2);
存在问题的尝试写法
1. 我的尝试1
SELECT D.name FROM Employees AS em , Departments AS D WHERE D.code=em.department AND ( SELECT department , COUNT(*) FROM Employees GROUP BY department ) > 2
问题:子查询返回多行多列结果,无法直接与数值2做比较,语法错误;语句中FROOM为拼写错误,应为FROM。
2. 我的尝试2
SELECT department , Count(*) FROM Employees WHERE COUNT(*)>2 GROUP BY department
问题:COUNT(*)是聚合函数,不能放在WHERE子句中做筛选——WHERE仅能筛选行级数据,聚合条件需用HAVING子句。
3. 朋友的尝试
SELECT D.Name FROM employees E INNER JOIN Departments D ON D.Code=E.Department HAVING COUNT(E.Name)>2
问题:缺少GROUP BY子句,HAVING必须配合GROUP BY使用(需明确按部门维度统计员工数量),否则数据库无法确定聚合的分组依据。
正确实现方案(不使用IN和子查询)
通过关联表后按部门分组,再用HAVING筛选员工数超2的部门:
SELECT D.Name FROM Departments D INNER JOIN Employees E ON D.Code = E.Department GROUP BY D.Code, D.Name HAVING COUNT(E.Id) > 2
说明:
- 用
INNER JOIN关联部门表与员工表,仅保留有员工的部门; - 按部门唯一标识
D.Code和名称D.Name分组(适配多数数据库的GROUP BY规则); - 用
COUNT(E.Id)统计部门员工数,HAVING筛选出数量大于2的部门名称。
内容的提问来源于stack exchange,提问作者Ariel Kaplan
相关产品推荐
相关产品推荐

