PostgreSQL中如何将两行SQL查询结果合并为一行(生物分类场景)
解决PostgreSQL中生物分类表的行转列需求
这是个很常见的行转列场景,咱们可以通过两种常用方法来实现把不同语言的俗名合并到同一行的需求:
方法一:使用条件聚合(推荐,扩展性好)
这种方法通过CASE WHEN结合聚合函数(比如MAX),在分组后把不同语言的俗名映射到对应的列上,适合后续可能新增语言的场景:
SELECT t.id, t.name, MAX(CASE WHEN l.id = 1 THEN p.pop END) AS namePT, MAX(CASE WHEN l.id = 2 THEN p.pop END) AS nameEN FROM taxon t LEFT JOIN pop p ON t.id = p.tax LEFT JOIN lang l ON p.lang = l.id GROUP BY t.id, t.name;
逻辑解释:
GROUP BY t.id, t.name确保我们以每个生物类群为一组CASE WHEN l.id = 1 THEN p.pop END会只保留葡萄牙语的俗名,其他语言的位置返回NULLMAX()函数会把每组里非NULL的俗名提取出来,最终同一类群的不同语言俗名就会出现在同一行
方法二:多次JOIN(适合语言固定的场景)
如果你的语言类型固定(只有葡萄牙语和英语),也可以直接分别和对应语言的俗名表做JOIN:
SELECT t.id, t.name, p_pt.pop AS namePT, p_en.pop AS nameEN FROM taxon t LEFT JOIN pop p_pt ON t.id = p_pt.tax AND p_pt.lang = 1 LEFT JOIN pop p_en ON t.id = p_en.tax AND p_en.lang = 2;
逻辑解释:
- 第一次JOIN只关联语言ID为1的俗名记录,得到葡萄牙语俗名
- 第二次JOIN只关联语言ID为2的俗名记录,得到英语俗名
- 因为是
LEFT JOIN,即使某个类群没有对应语言的俗名,也会返回NULL而不丢失数据
两种方法最终都会输出你期望的结果:
id name namePT nameEN 101 Mammalia mamíferos mammals
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

