题目链接:1789. 员工的直属部门
这道题虽然是个简单题,但是"坑"倒是不少,所以记录一下
思路:
题目要干:
一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为’N’.
要求:查出员工所属的直属部门
由题可知,两个过滤条件,一个是直属部门标识为Y(primary_flag = 'Y'
),另一个是该员工只加入了一个部门(COUNT(employee_id) = 1
)。又因为一个员工可以属于多个部门,所以需要分组处理(GROUP BY employee_id
)
解题过程:
看起来挺容易实现的,开始编写代码
SELECT employee_id, department_id
FROM Employee
GROUP BY employee_id
HAVING primary_flag = 'Y' OR COUNT(employee_id) = 1;
上面的代码是不是大家一下子就可以想到的?
看起来"一点儿毛病也没有",起码逻辑上没有问题
来来来,运行一下
咦 (⊙o⊙)? 咋还报错了?说 HAVING
子句中不认识primary_flag
心想:卧槽,不对啊,这不有FROM Employee
,为啥还报错,有毛病吧。
嘿,还真不能赖人家,这是因为,HAVING
子句中只允许是聚合函数(又称为组函数)或者是GROUP BY
后面的字段
还有一个问题:SELECT employee_id, department_id
这个也不对,虽然没有报错,但是不符合规定,使用GROUP BY
后,SELECT
中出现的非组函数的字段必须声明在GROUP BY
中。反而,在GROUP BY
中声明的字段可以不出现在SELECT
中。
将一个员工可以属于多个部门,所以需要分组处理(GROUP BY employee_id
)使用子查询,作为另一个过滤条件。
SELECT employee_id
FROM Employee
GROUP BY employee_id
HAVING COUNT(employee_id) = 1;
Code
SELECT employee_id, department_id
FROM Employee
WHERE primary_flag = 'Y' OR employee_id IN (SELECT employee_idFROM EmployeeGROUP BY employee_idHAVING COUNT(employee_id) = 1
);