(1)自连接查询和(2)子查询方式

0 阅读2分钟

image.png

🔍 核心知识点提取

1. 表结构与业务关系

  • 表名Employee

  • 关键字段

    • id:员工主键,唯一标识
    • name:员工姓名
    • salary:员工薪资
    • managerId:员工直属经理的id(为Null时表示该员工本身是经理,无上级)
  • 业务逻辑:员工与经理是自关联关系,通过managerId关联到同表中另一条经理记录的id


2. SQL 解题核心思路

(1)自连接查询(最常用)

Employee自连接,分别代表员工表(e)和经理表(m):

sql

SELECT e.name AS Employee
FROM Employee e
JOIN Employee m
ON e.managerId = m.id  -- 关联员工和其经理
WHERE e.salary > m.salary;  -- 筛选员工薪资 > 经理薪资
  • 关键:通过managerId = id建立员工与经理的映射,再比较两者薪资。
(2)子查询方式(另一种实现)

先查询所有经理的薪资,再用子查询筛选:

sql

SELECT name AS Employee
FROM Employee e
WHERE salary > (
    SELECT salary 
    FROM Employee 
    WHERE id = e.managerId
);
  • 注意:需保证每个员工都有对应的经理(即managerId不为Null),否则子查询会返回Null导致结果异常。

3. 关键语法与概念

  • 自连接(Self Join) :同一张表与自身进行连接,用于处理表内存在层级关系的场景(如员工 - 经理、组织架构)。
  • 关联条件e.managerId = m.id 是核心,确保每条员工记录匹配到其直属经理的记录。
  • 过滤条件e.salary > m.salary 实现 “收入比经理高” 的业务需求。
  • 结果别名:使用AS Employee将输出列名改为题目要求的格式。

4. 边界情况处理

  • 无经理的员工managerIdNull的记录(即经理本人)不会出现在结果中,因为他们没有上级经理可以比较薪资。
  • 数据完整性:若managerId引用了不存在的id,连接会自动过滤掉这条无效数据,避免错误。

5. Pandas 实现思路(对应 Pandas Schema)

如果用 Pandas 处理,核心是合并 + 过滤

python

运行

import pandas as pd

def find_employees(employee: pd.DataFrame) -> pd.DataFrame:
    # 自连接,匹配员工和经理
    merged = employee.merge(employee, left_on='managerId', right_on='id', suffixes=('_emp', '_mgr'))
    # 筛选薪资更高的员工
    result = merged[merged['salary_emp'] > merged['salary_mgr']][['name_emp']]
    # 重命名列名
    result.columns = ['Employee']
    return result
  • 逻辑与 SQL 一致:先合并关联,再筛选比较。

💡 总结

这道题的核心是自连接 / 自关联的应用,本质是处理表内的层级数据关系,同时考察条件筛选别名使用的基础语法。