You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:14:27