如何将SQL子查询转换为Left Outer Join?解决结果不一致问题
问题分析与修正方案
首先看你的原查询逻辑:它是统计每个部门里resign_date IS NULL的在职员工数量,同时返回所有部门(不管有没有员工)。
你尝试的左连接代码有两个关键问题:
- 连接条件里错误地写了
empl.resign_date IS NOT NULL,和原逻辑完全相反,这直接导致统计的是离职员工数,结果自然不对 - 多余的
DISTINCT:因为已经按部门分组(GROUP BY dept.dept_code, dept.dept_name),DISTINCT在这里没有意义,反而可能混淆逻辑
修正后的左连接代码
SELECT dept.dept_code "Dept Code", INITCAP(dept.dept_name) "Dept Name", COUNT(empl.employee_id) "Emp Count" -- 用员工主键统计更准确,避免null干扰 FROM DEPARTMENTS dept LEFT OUTER JOIN EMPLOYEES empl ON dept.DEPT_CODE = empl.dept_dept_code AND empl.resign_date IS NULL -- 这里和原查询的子查询条件保持一致 GROUP BY dept.dept_code, dept.dept_name
为什么这样写是对的?
- 连接条件匹配原逻辑:把
resign_date IS NULL放在ON子句里,左连接会保留所有部门,同时只关联该部门的在职员工 - 统计方式更严谨:用员工表的主键(比如
employee_id)来COUNT,因为如果某个部门没有员工,empl.employee_id会是NULL,COUNT会自动返回0,和原查询的子查询结果完全一致 - 去掉冗余的DISTINCT:GROUP BY已经确保每个部门只返回一行,不需要额外去重
你可以对比原查询和这个修正后的代码的执行结果,应该就能完全匹配了。
内容的提问来源于stack exchange,提问作者Miracle
相关产品推荐
相关产品推荐

