如何查询指定父母的所有最年长子女(含并列出生日期情况)
解决指定父母所有最年长子女的查询问题
原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' );
逻辑说明
- 内层子查询通过
MIN(p_child.bdate)拿到Michael Fox所有子女里最早的出生日期; - 外层查询关联两张表,筛选出属于该父母且出生日期等于这个最早日期的所有孩子,自然会包含双胞胎这类同生日的记录。
方法二:窗口函数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
相关产品推荐
相关产品推荐

