JOIN优化问询:替换进出口数据双国家ID时重复引用表的改进方法
优化国家名称关联:仅引用一次country_names表
嘿,这个问题我太懂了!重复引用同一张表确实显得不够简洁,咱们可以用CROSS APPLY(适用于SQL Server)或者LATERAL JOIN(适用于MySQL、PostgreSQL)来实现只引用一次country_names表,同时匹配原产国和目的国的ID。
具体实现代码
以SQL Server为例,用CROSS APPLY的写法:
SELECT d.*, name_mapping.origin_country_name, name_mapping.dest_country_name FROM data d CROSS APPLY ( SELECT MAX(CASE WHEN c.country_id = d.origin_country_id THEN c.country_name END) AS origin_country_name, MAX(CASE WHEN c.country_id = d.dest_country_id THEN c.country_name END) AS dest_country_name FROM country_names c WHERE c.country_id IN (d.origin_country_id, d.dest_country_id) ) AS name_mapping
如果是MySQL或PostgreSQL,只需要把CROSS APPLY换成LATERAL即可:
SELECT d.*, name_mapping.origin_country_name, name_mapping.dest_country_name FROM data d, LATERAL ( SELECT MAX(CASE WHEN c.country_id = d.origin_country_id THEN c.country_name END) AS origin_country_name, MAX(CASE WHEN c.country_id = d.dest_country_id THEN c.country_name END) AS dest_country_name FROM country_names c WHERE c.country_id IN (d.origin_country_id, d.dest_country_id) ) AS name_mapping
逻辑说明
- 子查询通过
WHERE c.country_id IN (d.origin_country_id, d.dest_country_id)只筛选当前数据行涉及的两个国家ID,避免不必要的全表扫描 - 用
CASE WHEN分别匹配原产国和目的国ID,返回对应的名称;MAX函数确保每个ID只返回唯一的名称(因为country_id在country_names表中是唯一主键) - 整个过程仅对
country_names表做一次引用,代码结构更简洁优雅
内容的提问来源于stack exchange,提问作者Vladimir
相关产品推荐
相关产品推荐

