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

多列存储拒绝原因表关联描述表简化SQL查询方法咨询

简化方案1:关联子查询(绝大多数数据库通用,写法最简洁)

不需要多次关联字典表,直接在查询字段中用子查询匹配对应原因描述,代码可读性更高:

select 
    account_no,
    resn_id1,
    (select resn_desc from reason_desc where resn_id = r.resn_id1) as resn_desc1,
    resn_id2,
    (select resn_desc from reason_desc where resn_id = r.resn_id2) as resn_desc2,
    resn_id3,
    (select resn_desc from reason_desc where resn_id = r.resn_id3) as resn_desc3,
    resn_id4,
    (select resn_desc from reason_desc where resn_id = r.resn_id4) as resn_desc4
from reject_reasons r;

如果REASON_DESC表的Resn_Id是主键/唯一索引,这个方案的查询性能和四次左连完全一致,代码更短更易维护。


简化方案2:行列转换(仅关联1次字典表,适合后续字段扩展场景)

如果后续可能新增更多拒绝原因字段(比如Resn_Id5、Resn_Id6),可以先把列转行关联字典表,再行转列输出,只需要关联1次REASON_DESC:

select 
    account_no,
    max(case when rn=1 then resn_id end) resn_id1,
    max(case when rn=1 then resn_desc end) resn_desc1,
    max(case when rn=2 then resn_id end) resn_id2,
    max(case when rn=2 then resn_desc end) resn_desc2,
    max(case when rn=3 then resn_id end) resn_id3,
    max(case when rn=3 then resn_desc end) resn_desc3,
    max(case when rn=4 then resn_id end) resn_id4,
    max(case when rn=4 then resn_desc end) resn_desc4
from (
    select 
        r.account_no,
        t.rn,
        t.resn_id,
        rd.resn_desc
    from reject_reasons r
    cross apply (
        select 1 rn, r.resn_id1 resn_id from dual union all
        select 2 rn, r.resn_id2 resn_id from dual union all
        select 3 rn, r.resn_id3 resn_id from dual union all
        select 4 rn, r.resn_id4 resn_id from dual
    ) t
    left join reason_desc rd on t.resn_id = rd.resn_id
)
group by account_no
order by account_no;

以上是Oracle语法示例,MySQL 8.0+、PostgreSQL可替换dual部分实现相同逻辑。


原写法小优化

你当前用的是Oracle专属的(+)左连接老语法,换成标准SQL的LEFT JOIN写法兼容性更好,切换其他数据库不需要大幅修改:

select 
    r.account_no,
    r.resn_id1, rd1.resn_desc resn_desc1,
    r.resn_id2, rd2.resn_desc resn_desc2,
    r.resn_id3, rd3.resn_desc resn_desc3,
    r.resn_id4, rd4.resn_desc resn_desc4
from reject_reasons r
left join reason_desc rd1 on r.resn_id1 = rd1.resn_id
left join reason_desc rd2 on r.resn_id2 = rd2.resn_id
left join reason_desc rd3 on r.resn_id3 = rd3.resn_id
left join reason_desc rd4 on r.resn_id4 = rd4.resn_id;

内容的提问来源于stack exchange,提问作者marecar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 23:24:02