请求编写SQL行转列查询:关联多表获取学生及父母信息
没问题,我来帮你搞定这个行转列的SQL查询需求~先理清楚我们的数据源和最终要输出的结果,再给出具体的语句和解释。
数据源表结构及数据
Parent表
| id | firstname |
|---|---|
| 1 | abc |
| 2 | bcd |
| 3 | cde |
StudentRelationship表
| relation | parentid | studentid |
|---|---|---|
| father | 1 | s0001 |
| mother | 2 | s0001 |
| father | 3 | s0002 |
STUDENT表
| id | firstname | lastname | address | sex |
|---|---|---|---|---|
| s0001 | shdj | khb | jxx | male |
实现需求的SQL语句
SELECT s.id AS studentid, CONCAT(s.firstname, ' ', s.lastname) AS name, MAX(CASE WHEN sr.relation = 'father' THEN p.firstname END) AS `father name`, MAX(CASE WHEN sr.relation = 'mother' THEN p.firstname END) AS `mother name`, s.sex, s.address FROM STUDENT s LEFT JOIN StudentRelationship sr ON s.id = sr.studentid LEFT JOIN Parent p ON sr.parentid = p.id GROUP BY s.id, s.firstname, s.lastname, s.sex, s.address;
语句解释
- 用LEFT JOIN关联三张表:这样即使学生没有对应的父亲/母亲记录(比如s0002没有母亲数据),也能保留对应行(空值填充);如果只需要查询有完整学生信息的记录,可以把
LEFT JOIN改成INNER JOIN。 - 行转列核心:通过
CASE WHEN判断亲属关系,配合MAX()聚合函数提取对应父母的名字——聚合函数用来消除分组后产生的空值,确保每个学生只有一行结果。 CONCAT()函数用来拼接学生的名和姓,生成name字段。- 最后按学生的唯一标识(
s.id)以及其他非聚合字段分组,保证结果的正确性。
查询结果示例
| studentid | name | father name | mother name | sex | address |
|---|---|---|---|---|---|
| s0001 | shdj khb | abc | bcd | male | jxx |
| s0002 | (null) | cde | (null) | (null) | (null) |
内容的提问来源于stack exchange,提问作者Renuka Chauhan
相关产品推荐
相关产品推荐

