两表关联时优先取table_b的store_nr,求替代Union+Join的高效SQL方案
问题描述
- 拥有两张表
table_a和table_b,需求为:两表关联后,当table_b.store_nr不为空时使用该值,若为空则使用table_a.id_nr。 - 当前通过
UNION与JOIN组合实现逻辑,但因表数据量较大,该方案效率低下,寻求更高效的解决办法。 - 现有实现代码:
SELECT a.month, a.id_nr from table_a a where a.id_nr not in (select distinct to_char(b.group_id) from table_b) union SELECT a.month, CASE WHEN b.store_nr is not null then b.store_nr ELSE to_number(a.id_nr) END id_nr FROM table_a a join table_b b on a.id_nr = to_char(b.group_id)
优化方案
原方案效率低的核心原因:UNION会对两个结果集做去重合并,且两次查询需分别扫描表,数据量大时开销极高。可以用LEFT JOIN替代,一次关联完成所有逻辑,避免多次扫描和去重操作。
优化后的SQL代码:
SELECT a.month, COALESCE(b.store_nr, TO_NUMBER(a.id_nr)) AS id_nr FROM table_a a LEFT JOIN table_b b ON a.id_nr = TO_CHAR(b.group_id)
逻辑说明
LEFT JOIN确保table_a的所有记录都被保留,无论是否能匹配到table_b的记录。COALESCE函数会依次返回第一个非空值:如果b.store_nr不为空则用它,否则用转换为数值类型的a.id_nr,和原逻辑完全一致。- 若存在
table_b中多条记录匹配同一条table_a记录的情况,需根据实际需求添加DISTINCT或分组逻辑(原UNION会自动去重,优化后需额外处理重复数据)。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

