Presto中如何基于table1的id、ref两列条件关联3张表查询
最优实现方案
核心逻辑是用SQL内置的COALESCE函数提取优先级更高的关联键,不需要拆分UNION分支,性能最优、可读性也最高,适配MySQL、PostgreSQL、Oracle、Spark SQL等绝大多数主流SQL引擎。
实现代码
SELECT UPPER(t1.Name) AS Name, t2.city, t3.orders AS `order` FROM table1 t1 INNER JOIN table2 t2 ON COALESCE(t1.id, t1.ref) = COALESCE(t2.id, t2.ref) INNER JOIN table3 t3 ON t2.city = t3.city
逻辑说明
COALESCE(t1.id, t1.ref)会优先取t1的id列值,如果id为空就取ref列值,完全匹配需求中的关联规则- 关联table2时同样用
COALESCE(t2.id, t2.ref)提取table2的唯一匹配键,和table1的关联键做等值匹配 - 最后和table3通过city字段关联取订单数值,最终结果和给出的预期完全一致
- 若使用的SQL引擎不支持
COALESCE,可以用等价的CASE WHEN写法替换:CASE WHEN t1.id IS NOT NULL THEN t1.id ELSE t1.ref END,性能差异极小,只是写法稍繁琐
注意事项
- 确保table1的id和ref列、table2的id和ref列数据类型一致,避免隐式转换影响关联性能
- 如果需要保留table1中匹配不到的记录,把
INNER JOIN改成LEFT JOIN即可,不会影响关联逻辑
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

