练习sql语句,所有题目来自于力扣(https://leetcode.cn/problemset/database/)的免费数据库练习题。
1789.员工的直属部门
表:Employee
| 列名 | 类型 |
|---|---|
| employee_id | int |
| department_id | int |
| primary_flag | varchar |
这张表的主键为 employee_id, department_id (具有唯一值的列的组合)
employee_id 是员工的ID
department_id 是部门的ID,表示员工与该部门有关系
primary_flag 是一个枚举类型,值分别为(‘Y’, ‘N’). 如果值为’Y’,表示该部门是员工的直属部门。 如果值是’N’,则否。
一个员工可以属于多个部门。当一个员工加入超过一个部门的时候,他需要决定哪个部门是他的直属部门。请注意,当员工只加入一个部门的时候,那这个部门将默认为他的直属部门,虽然表记录的值为’N’.
请编写解决方案,查出员工所属的直属部门。
返回结果 没有顺序要求 。

primary_flag 和 employee_id相同。然后搜索员工id和部门id。select e.employee_id,e.department_id
from Employee e
right join
(select employee_id,
case
when count(employee_id) = 1 then "N"
when count(employee_id) > 1 then "Y"
end as primary_flag
from Employee
group by employee_id
) as a
on e.primary_flag = a.primary_flag and e.employee_id = a.employee_id
最后看了题解,发现最简单的方法是利用union函数,以前从来没用过,union函数可以用于连接多个结果。union要求连接的两个结果列数和数据类型必须匹配,刚好这道题可以通过union将两种结果连接起来,第一种也就是直接count(*) = 1,第二种是primary_flag=“Y”。
select employee_id,department_id
from Employee
group by employee_id
having count(*) = 1
union
select employee_id,department_id
from Employee
where primary_flag = "Y"

能运行就行。