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

查询无下属员工的两种SQL方案差异排查:为何第二种测试失败?

导致两种方案结果不同的测试数据及错误原因

测试数据

执行以下SQL插入测试记录:

INSERT INTO employees (id, name, "managerId") VALUES
(1, '张三', NULL),   -- 该员工是经理(id=2的员工将其设为经理)
(2, '张三', 1);      -- 该员工是非经理(无其他员工的managerId为2)

预期结果

正确查询应返回非经理员工的姓名:张三(对应id=2的员工)

两种方案的执行差异

方案1结果(正确)

方案1通过NOT EXISTS逐个检查每个员工是否被其他员工设为经理,会正确返回id=2的员工姓名:

name
------
张三

方案2结果(错误)

方案2按name分组统计,会将id=1和id=2的两条记录合并:

  • Left Join后,id=1的记录匹配到一条e1数据(id=2的员工),id=2的记录无匹配的e1数据
  • 分组后count(e1.id)结果为1(仅统计非NULL值),不满足having count(e1.id) = 0的条件,最终无数据返回

错误原因

方案2的核心问题是使用name作为分组依据,但name并非表的唯一标识。当存在同名员工时,会将不同员工的记录合并统计,导致本该被返回的非经理员工被错误过滤。

内容的提问来源于stack exchange,提问作者Csaba Benko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 11:42:50