SQL面试题:查询同时拥有男女两种性别孩子的家长姓名
SQL面试题:查询同时拥有男性、女性孩子的家长姓名
题目说明
给定一张记录家长与子女性别信息的表,仅包含两个字段:
Parent Name:家长姓名Child Gender:孩子性别,常规取值为M(男性)、F(女性)
给定样例数据对应关系:
- 家长Alyssa的孩子性别包含F、M两类
- 家长Ben的孩子性别仅为F
- 家长Cathy的孩子性别均为M
需求为查询至少拥有1名男性孩子、1名女性孩子的家长姓名,上述样例的正确输出结果为Alyssa。
解题思路
核心判断逻辑非常明确:符合要求的家长,必须同时关联过男性、女性两类孩子的记录,因此按家长姓名分组做聚合统计是最高效的实现方式,不需要写冗余的自连接或多层嵌套子查询。
根据业务场景的不同,可以选两种常用实现写法:
参考SQL实现
写法1:通用去重计数写法(全SQL方言兼容)
直接统计每个家长名下孩子性别的去重数量,去重值等于2即说明同时覆盖两类性别,满足筛选要求:
SELECT `Parent Name` FROM parent_child_info -- 替换为实际业务中的表名即可 GROUP BY `Parent Name` HAVING COUNT(DISTINCT `Child Gender`) = 2;
这个写法的优势是不需要硬编码性别枚举值,通用性更强,哪怕后续性别字段新增其他枚举值,只要家长名下存在两类不同性别的孩子就会被正确命中。
写法2:条件聚合写法(精准匹配M/F两类性别)
如果业务要求必须严格同时存在M、F两种性别,需要排除其他性别值的干扰,可以用条件聚合做精准校验:
SELECT `Parent Name` FROM parent_child_info -- 替换为实际业务中的表名即可 GROUP BY `Parent Name` HAVING -- 至少1个男孩 SUM(CASE WHEN `Child Gender` = 'M' THEN 1 ELSE 0 END) >= 1 -- 至少1个女孩 AND SUM(CASE WHEN `Child Gender` = 'F' THEN 1 ELSE 0 END) >= 1;
内容的提问来源于stack exchange,提问作者Boba Evans
相关产品推荐
相关产品推荐

