You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何正确改写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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 20:50:25