如何使用LEFT JOIN仅展示emp_target表的列
问题:如何使用LEFT JOIN仅展示emp_target表的列?
现有表结构
- Emp表:
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO - emp_target表:
TOTAL_NO_OF_EMPLOYEES TOTAL_SAL HIGHEST_SAL LOWEST_SAL AVERGAE_SAL DEPTNO
期望输出
仅展示emp_target表的列:
TOTAL_NO_OF_EMPLOYEES TOTAL_SAL HIGHEST_SAL LOWEST_SAL AVERGAE_SAL DEPTNO
你尝试的SQL语句
select count(empno) as Total_no_of_employees,sum(sal) as Total_sal,max(sal) as Highest_sal, round(avg(sal)) as avergae_sal,min(sal) as lowest_sal from emp Left outer join emp_target on emp.deptno = emp_target.deptno where emp.deptno not in (select deptno from emp_target);
问题分析与修正
你的SQL存在两个核心问题:
- 当前查询是从
emp表聚合数据,而非直接选取emp_target的列,和需求不符。 LEFT JOIN后添加where emp.deptno not in (...)会将左连接转为内连接效果,过滤掉emp_target中匹配的行,不符合展示emp_target列的需求。
场景1:仅关联后返回emp_target的所有列
如果需求是通过LEFT JOIN关联Emp表后,只返回emp_target表的列,直接在SELECT子句指定emp_target.*即可:
SELECT emp_target.* FROM emp LEFT JOIN emp_target ON emp.deptno = emp_target.deptno
场景2:统计Emp表中未在emp_target里的部门数据(匹配emp_target列格式)
从你的尝试SQL推测,你可能需要找出Emp表中存在但emp_target表中没有的部门,计算这些部门的统计数据并以emp_target的列格式输出,此时可以调整为:
SELECT COUNT(emp.empno) AS TOTAL_NO_OF_EMPLOYEES, SUM(emp.sal) AS TOTAL_SAL, MAX(emp.sal) AS HIGHEST_SAL, MIN(emp.sal) AS LOWEST_SAL, ROUND(AVG(emp.sal)) AS AVERGAE_SAL, emp.DEPTNO FROM emp LEFT JOIN emp_target ON emp.deptno = emp_target.deptno WHERE emp_target.deptno IS NULL GROUP BY emp.DEPTNO
- 使用
emp_target.deptno IS NULL筛选Emp表中无匹配的部门,比NOT IN更可靠(避免NULL值导致的异常)。 - 通过
GROUP BY emp.DEPTNO按部门分组计算统计值,输出列名与emp_target表一致,符合期望格式。
内容的提问来源于stack exchange,提问作者Testing
相关产品推荐
相关产品推荐

