力扣-高频 SQL 50 题(基础版)-1789. 员工的直属部门

力扣-高频 SQL 50 题(基础版)-1789. 员工的直属部门
一、完整建表 SQLMySQL 语法CREATE TABLE Employee ( employee_id INT, department_id INT, primary_flag VARCHAR(1), PRIMARY KEY (employee_id, department_id) );INSERT INTO Employee (employee_id, department_id, primary_flag) VALUES (1, 1, N), (2, 1, Y), (2, 2, N), (3, 3, N), (4, 2, N), (4, 3, Y), (4, 4, N);二、需求一个员工可以属于多个部门。当一个员工加入超过一个部门的时候他需要决定哪个部门是他的直属部门。请注意当员工只加入一个部门的时候那这个部门将默认为他的直属部门虽然表记录的值为N.请编写解决方案查出员工所属的直属部门。返回结果没有顺序要求。返回结果格式如下例子所示三、 思路与解题这道题真的很魔鬼就像是实际中有大量人写反了是非对错但是我们处理SQL的又必须纠正过来然后还没有权限更改原数据库同一张表内存在多套完全不同的判定逻辑不能用单一WHERE条件统一处理。 如果强行写子查询、窗口函数新手很难读懂而用 UNION 把两类员工拆开分别查询逻辑一刀切开可读性直接拉满-- 第一部分多部门有Y标记的员工 SELECT employee_id, department_id FROM Employee WHERE primary_flag Y UNION -- 第二部分只有单个部门、无Y标记的员工 SELECT employee_id, department_id FROM Employee GROUP BY employee_id HAVING COUNT(*) 1;四、UNION 核心知识点铺垫UNION合并多条 SELECT 结果自动去重本题两类无重复员工去重无影响UNION ALL直接拼接结果不做去重校验性能更高若确定两边无重复推荐用使用前提多条 SELECT 查询的列数量、字段类型、顺序完全一致适用场景多套互斥筛选逻辑拆分代码降低理解成本