You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

两表关联时优先取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 07:10:33