如何查询SQL表中未包含全部角色的分支及缺失角色
问题描述
原始数据表
| employee_id | branch | role |
|---|---|---|
| 1 | A | admin |
| 2 | A | engineer |
| 3 | A | finance |
| 4 | B | admin |
| 5 | B | finance |
| 6 | C | engineer |
需求
找出未包含全部角色的分支及其缺失的角色:
- 分支A包含全部角色,无需输出
- 分支B缺失
engineer角色 - 分支C缺失
admin和finance角色
期望输出
| branch | role |
|---|---|
| B | engineer |
| C | admin |
| C | finance |
实现SQL语句
WITH all_roles AS ( SELECT DISTINCT role FROM employees ), all_branches AS ( SELECT DISTINCT branch FROM employees ) SELECT ab.branch, ar.role FROM all_branches ab CROSS JOIN all_roles ar LEFT JOIN employees e ON ab.branch = e.branch AND ar.role = e.role WHERE e.employee_id IS NULL ORDER BY ab.branch, ar.role;
思路说明
- 用两个CTE分别提取所有不重复的角色(
all_roles)和所有不重复的分支(all_branches) - 通过
CROSS JOIN生成所有分支与角色的可能组合 - 用
LEFT JOIN关联原始表,筛选出原始表中不存在的组合(即employee_id IS NULL的记录),这些就是各分支缺失的角色
内容的提问来源于stack exchange,提问作者kjloh
相关产品推荐
相关产品推荐

