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

如何查询指定父母的所有最年长子女(含并列出生日期情况)

解决指定父母所有最年长子女的查询问题

原SQL的问题在于用了LIMIT 1,这会直接砍掉同出生日期的其他最年长子女(比如双胞胎),只返回排序后的第一条记录。要满足“返回所有并列最年长子女”的需求,我们可以用两种可靠的方式实现:

方法一:子查询锁定最早出生日期

先找出目标父母所有子女的最早出生日期,再筛选出所有匹配该日期的子女:

SELECT p.fname, p.lname
FROM persons p
JOIN births b ON p.fname = b.fname AND p.lname = b.lname
WHERE b.fthr_fname = 'Michael' AND b.fthr_lname = 'Fox'
AND p.bdate = (
    -- 子查询计算Michael Fox所有子女的最小(最早)出生日期
    SELECT MIN(p_child.bdate)
    FROM persons p_child
    JOIN births b_child ON p_child.fname = b_child.fname AND p_child.lname = b_child.lname
    WHERE b_child.fthr_fname = 'Michael' AND b_child.fthr_lname = 'Fox'
);

逻辑说明

  1. 内层子查询通过MIN(p_child.bdate)拿到Michael Fox所有子女里最早的出生日期;
  2. 外层查询关联两张表,筛选出属于该父母且出生日期等于这个最早日期的所有孩子,自然会包含双胞胎这类同生日的记录。

方法二:窗口函数RANK()排序筛选

如果你的数据库支持窗口函数(比如MySQL 8.0+、PostgreSQL、SQLite 3.25+等),用RANK()会更直观:

SELECT fname, lname
FROM (
    SELECT p.fname, p.lname,
           -- 按出生日期升序排名,最早生日的孩子rank为1,同生日的rank相同
           RANK() OVER (ORDER BY p.bdate ASC) AS birth_rank
    FROM persons p
    JOIN births b ON p.fname = b.fname AND p.lname = b.lname
    WHERE b.fthr_fname = 'Michael' AND b.fthr_lname = 'Fox'
) ranked_children
WHERE birth_rank = 1;

逻辑说明

  • RANK()会给每个子女按出生日期排序,最年长的孩子(最早生日)的排名是1;
  • 若有多个同生日的子女,他们的birth_rank都会是1,因此筛选birth_rank = 1就能拿到所有符合条件的最年长子女。

这两种方法都能正确返回示例中的TwinOne和TwinTwo,完美满足需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:14:55