如何正确改写SQL嵌套子查询:找出含名为John员工的部门
正确查询写法及原语句问题分析
原语句的问题
- 子查询
select first_name from hr.employees会返回所有员工的名字(多行结果),用=这种单行比较运算符会直接报错,因为=只能处理单个值的对比。 - 两个表直接用逗号连接却没加关联条件,会产生笛卡尔积,也就是所有员工和所有部门的组合都被查出来,完全不符合需求。
几种正确的改写方式
方式1:内连接(最直观的写法)
通过员工表和部门表的DEPARTMENT_ID关联,筛选出有John的部门,用DISTINCT避免同一个部门有多个John时重复输出:
SELECT DISTINCT d.DEPARTMENT_ID, d.DEPARTMENT_NAME FROM HR.EMPLOYEES e INNER JOIN HR.DEPARTMENTS d ON e.DEPARTMENT_ID = d.DEPARTMENT_ID WHERE e.FIRST_NAME = 'John';
方式2:子查询筛选部门ID
先找出所有叫John的员工所在的部门ID,再去部门表里查对应信息:
SELECT d.DEPARTMENT_ID, d.DEPARTMENT_NAME FROM HR.DEPARTMENTS d WHERE d.DEPARTMENT_ID IN ( SELECT e.DEPARTMENT_ID FROM HR.EMPLOYEES e WHERE e.FIRST_NAME = 'John' );
方式3:EXISTS子查询(大数据量下性能更优)
检查每个部门是否存在名叫John的员工,这种写法数据库不需要提前生成所有符合条件的部门ID列表,执行效率更高:
SELECT d.DEPARTMENT_ID, d.DEPARTMENT_NAME FROM HR.DEPARTMENTS d WHERE EXISTS ( SELECT 1 FROM HR.EMPLOYEES e WHERE e.DEPARTMENT_ID = d.DEPARTMENT_ID AND e.FIRST_NAME = 'John' );
内容的提问来源于stack exchange,提问作者Rume Diablo
相关产品推荐
相关产品推荐

