SQL查询如何选取所有匹配结果并排除空值(多表关联场景)
数据库表结构说明
现有4张业务表结构如下:
- Agents(坐席表)
字段名 字段含义 agent_id 坐席唯一ID agent_name 坐席姓名 - Teams(团队表)
字段名 字段含义 team_id 团队唯一ID team_name 团队名称 agent_id 归属坐席ID - Menu(队列表)
字段名 字段含义 menu_id 队列唯一ID menu_name 队列名称 - Team_assignment(团队队列关联表)
字段名 字段含义 menu_id 关联队列ID team_id 关联团队ID
查询需求
编写SQL筛选符合以下规则的坐席:
- 已分配至所有团队
- 已分配至所有队列
- 排除未分配任何队列的坐席
已知业务规则:所有坐席都会被分配对应团队,但不一定分配队列;最终返回结果需要消除所有null值。
实现SQL
SELECT a.agent_id, a.agent_name FROM Agents a INNER JOIN Teams t ON a.agent_id = t.agent_id INNER JOIN Team_assignment ta ON t.team_id = ta.team_id INNER JOIN Menu m ON ta.menu_id = m.menu_id GROUP BY a.agent_id, a.agent_name HAVING COUNT(DISTINCT t.team_id) = (SELECT COUNT(team_id) FROM Teams) AND COUNT(DISTINCT ta.menu_id) = (SELECT COUNT(menu_id) FROM Menu) ;
逻辑说明
- 所有关联都用
INNER JOIN,会自动过滤掉没有分配队列的坐席,同时不会产生空值,满足结果无null的要求 - 按坐席分组后做两层计数校验:
- 统计坐席关联的去重团队数,和系统总团队数对比,相等说明坐席覆盖了所有团队
- 统计坐席关联的去重队列数,和系统总队列数对比,相等说明坐席覆盖了所有队列
- 两个条件同时命中的坐席就是目标结果,不需要额外做null过滤。
内容的提问来源于stack exchange,提问作者Ali Syed
相关产品推荐
相关产品推荐

