如何编写单条SQL查询展示员工、直属经理及部门薪酬相关信息
正确SQL实现方案
原代码错误原因
UNION ALL要求前后查询的列数、对应列数据类型完全匹配,你第一段查询返回3列,第二段仅返回1列,直接触发列数不匹配报错- 你的需求不需要拆分普通员工和经理用
UNION ALL查询,拆分查询反而会增加逻辑复杂度 - 原代码中判断值不为NULL的写法错误,SQL中
<> NULL的判断永远返回假,必须用IS NOT NULL判断非空 - 原代码中
sum的用法不符合需求,你需要的是薪资和佣金的数值之和,不是计数
正确SQL语句
默认你的emp表包含mgr字段存储直属经理的员工编号empno,如果实际字段名不同可自行调整:
SELECT e.ename AS 员工姓名, m.ename AS 直属经理姓名, d.name AS 所属部门名称, (COALESCE(e.sal, 0) + COALESCE(e.comm, 0)) AS 薪资佣金总和 FROM emp e LEFT JOIN emp m ON e.mgr = m.empno -- 自关联获取直属经理信息,左连接保留无经理的员工 LEFT JOIN dept d ON e.deptno = d.deptno;
逻辑说明
- 员工表自关联用左连接,确保没有直属经理的员工不会被过滤,对应经理姓名字段返回NULL
- 用标准SQL函数
COALESCE把为NULL的薪资/佣金转换为0再相加,避免NULL参与计算导致结果为NULL的问题 - 所有员工(包含管理人员)都会被正常返回,不需要额外拆分查询逻辑
内容的提问来源于stack exchange,提问作者Bordento22
相关产品推荐
相关产品推荐

