查询无下属员工的两种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
相关产品推荐
相关产品推荐

