查询拥有至少5名直属下属的管理者 - SQL问题求解
SQL查询问题排查与正确解法
现有表结构与数据
表employee3_3包含字段id、name、department、managerId,数据如下:
| id | name | department | managerId |
|---|---|---|---|
| 101 | John | A | null |
| 102 | Dan | A | 101 |
| 103 | James | A | 101 |
| 104 | Amy | A | 101 |
| 105 | Anne | A | 101 |
| 106 | Ron | A | 101 |
需求:找出拥有至少5名直属员工的管理者。
第一个查询的问题
WITH cte AS ( SELECT name, managerid, (SELECT COUNT(b.managerid) FROM employee3_3 AS b) AS result FROM employee3_3 ) SELECT employee3_3.name FROM employee3_3 FULL JOIN cte ON employee3_3.name = cte.name WHERE result = 5 AND cte.managerid = NULL
- 子查询无关联条件:里面的
COUNT(b.managerid)统计的是全表所有非空managerid的总数(这里刚好是5),不是按每个管理者分组统计的直属员工数 - 空值判断错误:SQL里判断空值必须用
IS NULL,cte.managerid = NULL永远不会匹配到任何数据 - 逻辑冗余:FULL JOIN完全没必要,整个查询的关联逻辑混乱,没有聚焦到“按管理者统计员工数”的核心需求
第二个查询的问题
WITH cte AS ( SELECT managerid, COUNT(managerid) AS number_of_employees FROM employee3_3 GROUP BY managerid, managerid ) SELECT name FROM employee3_3 AS e JOIN cte ON e.managerid = cte.managerid WHERE cte.number_of_employees <= 5
- GROUP BY冗余:重复写
managerid属于多余操作,只需写一次即可 - JOIN条件错误:应该用
e.id = cte.managerid来关联管理者的id和员工统计的managerid,当前条件关联的是员工自己的managerid,会把所有员工都查出来,而非管理者 - 条件方向错误:需求是“至少5名”,应该用
>=5而不是<=5
正确解法
方法1:使用CTE分组统计后关联
WITH manager_employee_count AS ( SELECT managerId, COUNT(*) AS direct_employees FROM employee3_3 WHERE managerId IS NOT NULL -- 只统计有上级的员工,排除管理者自己 GROUP BY managerId HAVING COUNT(*) >= 5 -- 筛选出直属员工数>=5的管理者ID ) SELECT e.name FROM employee3_3 e JOIN manager_employee_count mec ON e.id = mec.managerId;
方法2:子查询直接关联
SELECT e.name FROM employee3_3 e JOIN ( SELECT managerId, COUNT(*) AS direct_employees FROM employee3_3 WHERE managerId IS NOT NULL GROUP BY managerId HAVING COUNT(*) >= 5 ) mec ON e.id = mec.managerId;
两种方法的逻辑一致:
- 先从员工表中按
managerId分组,统计每个管理者的直属员工数,筛选出数量≥5的managerId - 将统计结果和原表关联,通过管理者的
id匹配对应的name
执行后会正确返回结果:John
内容的提问来源于stack exchange,提问作者Ale
相关产品推荐
相关产品推荐

