如何编写SQL语句从relation和people两张表查询孩子、母亲、父亲对应数据
原有SQL问题分析
- 字段名写错:relation表的父ID字段是
pid不是p_id,关联条件不匹配 - 逻辑错误:用SUM计数只能得到性别为男/女的人数,拿不到对应的人员姓名
- 语法错误:CASE判断语句缺少
END关键字闭合 - 缺少孩子姓名的关联逻辑:没有将cid关联people表取孩子名称,所以无法输出Child字段
正确SQL语句
SELECT -- 首字母大写适配输出要求,如果不需要可以直接写c.name AS Child CONCAT(UPPER(LEFT(c.name,1)), LOWER(SUBSTRING(c.name,2))) AS Child, MAX(CASE WHEN p.gender = 'F' THEN p.name END) AS Mother, MAX(CASE WHEN p.gender = 'M' THEN p.name END) AS Father FROM relation r -- 关联people表取孩子的姓名 INNER JOIN people c ON r.cid = c.id -- 关联people表取对应pid下的父母信息 INNER JOIN people p ON r.pid = p.id GROUP BY r.cid, c.name
逻辑说明
- 先通过
relation.cid = people.id关联拿到每个孩子的姓名 - 再通过
relation.pid = people.id关联拿到当前pid对应的两名父母记录 - 用CASE语句按性别筛选母亲和父亲的姓名,用MAX聚合取出对应值
- 按孩子ID和姓名分组,确保每个孩子对应一条输出记录
注:你给出的示例输出中第三行Lucky对应的Mother为Rohit、Father为Meena,和提供的people表中Rohit性别为M、Meena性别为F的设定冲突,如果是手误写反,上述SQL输出结果和预期一致;如果确实要按给出的示例输出,把CASE语句中性别和字段的对应关系调换即可。
内容的提问来源于stack exchange,提问作者Lonakshi Bhagat
相关产品推荐
相关产品推荐

