You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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筛选符合以下规则的坐席:

  1. 已分配至所有团队
  2. 已分配至所有队列
  3. 排除未分配任何队列的坐席

已知业务规则:所有坐席都会被分配对应团队,但不一定分配队列;最终返回结果需要消除所有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 17:06:28