PostgreSQL如何根据产品类型从不同表取值合并为同一别名列
解法1:LEFT JOIN + CASE WHEN 实现(推荐,性能更优)
先将product表分别和两个属性表做左关联,再根据type字段匹配取对应表的value即可,关联条件里加上type筛选可以减少无效关联的数据量:
SELECT p.product_id, CASE WHEN p.type = 'type1' THEN av1.value WHEN p.type = 'type2' THEN av2.value END AS value FROM product p LEFT JOIN attribute_value_1 av1 ON p.product_id = av1.product_id AND p.type = 'type1' LEFT JOIN attribute_value_2 av2 ON p.product_id = av2.product_id AND p.type = 'type2';
解法2:UNION ALL 合并属性表再关联
如果后续会新增更多对应不同type的属性表,推荐用这种写法,扩展时只需要在UNION ALL下加新的属性表查询即可:
SELECT p.product_id, av.value FROM product p INNER JOIN ( SELECT product_id, value, 'type1' AS type FROM attribute_value_1 UNION ALL SELECT product_id, value, 'type2' AS type FROM attribute_value_2 ) av ON p.product_id = av.product_id AND p.type = av.type;
以上两种写法都可以得到你期望的查询结果,如果同一个product_id在对应属性表中存在多条value记录,两种写法都会返回多行结果,符合常规关联逻辑。
内容的提问来源于stack exchange,提问作者JamesStandbridge
相关产品推荐
相关产品推荐

