Oracle连接查询求助:如何获取员工全部门关联的FLAG为N的记录
问题:获取员工与所有部门关联的FLAG状态
现有表结构及数据
Department表
| DEPT | FLAG |
|---|---|
| D1 | Y |
| D2 | Y |
| D3 | Y |
| D4 | Y |
Employee表
| EMP | DEPT | FLAG |
|---|---|---|
| EMP1 | D1 | Y |
| EMP1 | D2 | Y |
| EMP2 | D1 | Y |
| EMP2 | D2 | Y |
| EMP2 | D3 | Y |
| EMP3 | D3 | Y |
| EMP4 | D2 | Y |
| EMP4 | D3 | Y |
期望输出结果
| EMP | DEPT | FLAG |
|---|---|---|
| EMP1 | D1 | Y |
| EMP1 | D2 | Y |
| EMP1 | D3 | N |
| EMP1 | D4 | N |
| EMP2 | D1 | Y |
| EMP2 | D2 | Y |
| EMP2 | D3 | Y |
| EMP2 | D4 | N |
| EMP3 | D1 | N |
| EMP3 | D2 | N |
| EMP3 | D3 | Y |
| EMP3 | D4 | N |
| EMP4 | D1 | N |
| EMP4 | D2 | Y |
| EMP4 | D3 | Y |
| EMP4 | D4 | N |
当前问题
查询所有员工时,仅能返回FLAG为Y的记录,无法获取员工未关联部门对应的FLAG=N记录;但指定单个员工使用外连接时可以得到N记录。
解决方案
使用以下SQL语句即可生成期望结果:
WITH UniqueEmployees AS ( SELECT DISTINCT EMP FROM Employee ) SELECT u.EMP, d.DEPT, CASE WHEN e.EMP IS NOT NULL THEN 'Y' ELSE 'N' END AS FLAG FROM UniqueEmployees u CROSS JOIN Department d LEFT JOIN Employee e ON u.EMP = e.EMP AND d.DEPT = e.DEPT ORDER BY u.EMP, d.DEPT;
思路说明
- 先用
WITH子查询提取所有不重复的员工,避免重复处理同一员工的多条记录; - 通过
CROSS JOIN生成所有员工与所有部门的组合,这是补全N记录的核心; - 左连接原Employee表,匹配员工和部门的关联关系;
- 用
CASE语句判断是否匹配到记录,匹配到则标记为Y,否则为N; - 最后按员工和部门排序,保证结果有序。
内容的提问来源于stack exchange,提问作者Soumyadeep
相关产品推荐
相关产品推荐

