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

Oracle数据库中如何查询每位员工的最年幼子女信息?

Oracle查询每位员工最年幼子女的实现方案

要获取每位员工及其最年幼(出生日期最晚)子女的信息,有两种常用的Oracle实现方式,以下具体说明:

方法一:使用窗口函数ROW_NUMBER()(推荐)

窗口函数可以轻松实现分组内的排序和筛选,这是最直观且高效的方式:

SELECT Emp_ID, Depdt_name, Depdt_dob
FROM (
    SELECT 
        d.Emp_ID,
        d.Depdt_name,
        d.Depdt_dob,
        ROW_NUMBER() OVER (PARTITION BY d.Emp_ID ORDER BY d.Depdt_dob DESC) AS rn
    FROM Dependants d
    JOIN Employees e ON d.Emp_ID = e.Emp_ID -- 确保只返回有对应员工记录的子女,符合需求中"每位员工"的范围
) t
WHERE rn = 1;

逻辑解释:

  • PARTITION BY d.Emp_ID:按员工ID分组,将每个员工的子女归为独立组
  • ORDER BY d.Depdt_dob DESC:在每组内按出生日期倒序排列,最晚出生的子女排在组内第1位
  • ROW_NUMBER():为每组内的记录生成组内行号,最年幼的子女行号为1
  • 外层查询筛选出行号为1的记录,即可得到每个员工的最年幼子女信息

方法二:使用关联子查询(兼容旧版Oracle)

如果你的Oracle版本不支持窗口函数,可以用关联子查询获取每个员工的最大出生日期,再关联回子女表:

SELECT d.Emp_ID, d.Depdt_name, d.Depdt_dob
FROM Dependants d
JOIN Employees e ON d.Emp_ID = e.Emp_ID
WHERE d.Depdt_dob = (
    SELECT MAX(d2.Depdt_dob)
    FROM Dependants d2
    WHERE d2.Emp_ID = d.Emp_ID
);

逻辑解释:

  • 子查询SELECT MAX(d2.Depdt_dob) FROM Dependants d2 WHERE d2.Emp_ID = d.Emp_ID:获取当前员工的子女中最晚的出生日期
  • 外层查询筛选出当前员工中出生日期等于该最大值的记录,即为最年幼的子女

为什么单独用Rownum无法得到正确结果?

Rownum是Oracle对整个结果集生成的全局行号,并非分组后的组内行号。如果直接在子查询中用Rownum=1,只会返回全局排序后的第一条记录,而非每个员工分组后的第一条。必须先通过窗口函数或分组逻辑生成组内编号,再筛选编号为1的记录,才能得到每组的目标数据。

内容的提问来源于stack exchange,提问作者Hanane M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 11:02:58