子查询返回非预期行:筛选同部门同薪资员工问题排查
问题排查与SQL修正
问题原因
原SQL的子查询返回了所有有佣金员工的(d_id,salary)组合,包括那些仅对应单个员工的组合:
- (20, 3000) 对应Jeremiah(仅他自己在该组合)
- (10, 4000) 对应James(仅他自己在该组合)
这导致主查询把这些单个员工也纳入了结果,超出了预期范围。结合预期输出可以判断,真实需求是筛选出所在(d_id,salary)组合中既有佣金员工、又有至少两名员工的所有员工。
修正后的SQL
SELECT name, d_id, salary FROM employees WHERE (d_id, salary) IN ( SELECT d_id, salary FROM employees GROUP BY d_id, salary HAVING COUNT(*) > 1 AND MAX(commission) > 0 );
逻辑说明
- 子查询通过
GROUP BY d_id, salary分组,筛选满足两个条件的组合:COUNT(*) > 1:该组合下至少有两名员工MAX(commission) > 0:该组合中存在至少一名有佣金的员工
- 主查询只选取属于这些合法组合的员工,最终得到预期结果:
| name | d_id | salary |
|---|---|---|
| John | 10 | 3000 |
| Jane | 10 | 3000 |
内容的提问来源于stack exchange,提问作者fpully
相关产品推荐
相关产品推荐

