SQL多表合并查询需求:将Person表与描述表转换为宽表
我来帮你搞定这个表合并的需求!这其实是个很常见的**行转列(Pivot)**场景,给你两种靠谱的实现方案,适配不同的数据库环境:
方案一:通用CASE WHEN写法(兼容绝大多数数据库)
这种写法几乎所有关系型数据库(MySQL、SQL Server、Oracle、PostgreSQL等)都支持,兼容性拉满:
SELECT pt.Name, MAX(CASE WHEN pdt.Lang = 'en' THEN pdt.Desc END) AS Desc_en, MAX(CASE WHEN pdt.Lang = 'de' THEN pdt.Desc END) AS Desc_de FROM Person_Tbl pt JOIN PersonDescription_Tbl pdt ON pt.PersonID = pdt.PersonId GROUP BY pt.PersonID, pt.Name;
代码说明:
- 通过
JOIN关联两张表,匹配同一个人的基础信息和多语言描述 - 用
CASE WHEN分别筛选出英文(en)和德文(de)的描述内容,MAX()聚合函数用来确保每个分组下只保留有效的描述值(因为每个Person+Lang组合只有一条数据,用MIN()也能得到同样结果) - 最后按
PersonID和Name分组,保证每个人的信息只显示一行
方案二:使用PIVOT关键字(适合支持该语法的数据库)
如果你的数据库支持PIVOT语法(比如SQL Server、Oracle、PostgreSQL 11及以上版本),可以用更简洁的写法:
SELECT Name, [en] AS Desc_en, [de] AS Desc_de FROM ( SELECT pt.Name, pdt.Desc, pdt.Lang FROM Person_Tbl pt JOIN PersonDescription_Tbl pdt ON pt.PersonID = pdt.PersonId ) AS SourceTable PIVOT ( MAX(Desc) FOR Lang IN ([en], [de]) ) AS PivotTable;
代码说明:
- 先通过子查询关联两张表,拿到需要的Name、Desc和Lang字段
- 用
PIVOT将Lang列中的en和de值转成对应的列名,MAX(Desc)用来聚合每个分组的描述内容 - 最后给转成的列重命名为
Desc_en和Desc_de,匹配你想要的输出格式
小提示:
如果之后需要支持更多语言,比如法文(fr),只需要在CASE WHEN里新增分支,或者在PIVOT的IN子句里添加[fr]即可。
内容的提问来源于stack exchange,提问作者Subash J
相关产品推荐
相关产品推荐

