一对多关联表:将Attributes表值转为结果列的SQL查询实现
解决方案
可以使用条件聚合实现行转列,将Attributes表中的field值转为结果集的列,以下是对应的SQL语句:
SELECT p.name, p.age, p.phone, MAX(CASE WHEN a.field = 'hair' THEN a.value END) AS hair, MAX(CASE WHEN a.field = 'eyes' THEN a.value END) AS eyes, MAX(CASE WHEN a.field = 'height' THEN a.value END) AS height FROM Person p LEFT JOIN Attributes a ON p.id = a.fk GROUP BY p.id, p.name, p.age, p.phone;
关键细节说明:
- LEFT JOIN:确保所有Person记录都被保留,即使没有对应属性数据,缺失字段自动填充
NULL。 - 条件聚合逻辑:
CASE WHEN根据field匹配目标列,将对应的value填充进去;MAX()函数用于聚合分组,因为每个Person的同一个field只会有一条记录,聚合后不会改变值,同时保证每个Person仅返回一行结果。 - GROUP BY规则:必须包含Person表中所有非聚合字段(id、name、age、phone),符合SQL的分组要求,避免出现分组错误。
内容的提问来源于stack exchange,提问作者craigh
相关产品推荐
相关产品推荐

