Oracle关联解码表查询多列编码对应描述值实现方法
Oracle 双字段编码关联解码实现方案
涉及表基础信息
- 人员信息主表(默认表名
person_info):存储人员全量基础信息,核心字段包含reason_1(首要死亡原因编码)、reason_2(次要死亡原因编码) - 死亡原因解码表(默认表名
death_reason_dict):共142条记录,包含2个核心字段:code(死亡原因唯一编码)、description(编码对应的具体原因描述)
约束规则
- 禁止手动逐行录入编码与描述的映射关系,需直接复用现有解码表数据
- 禁止使用
decode函数做编码匹配 - 禁止使用WITH子句(子查询因式分解)
- 输出需保留主表全部原有字段,新增
reason_1_desc、reason_2_desc两个字段,分别存储两个死亡原因编码对应的描述值
可直接执行的实现SQL
SELECT p.*, d1.description AS reason_1_desc, d2.description AS reason_2_desc FROM person_info p LEFT JOIN death_reason_dict d1 ON p.reason_1 = d1.code LEFT JOIN death_reason_dict d2 ON p.reason_2 = d2.code;
逻辑说明
- 对同一张解码表做两次左连接,分别赋予不同别名
d1、d2,依次匹配主表的reason_1、reason_2字段,无需重复建表或手动维护映射 - 选用左连接而非内连接,可避免因编码为空、编码在解码表无对应记录导致主表人员数据被意外过滤,无匹配记录时对应描述字段自动返回空值
- 语句未使用
decode函数、未使用WITH子句,完全满足所有约束要求
样例效果验证
主表测试数据:
person_id name reason_1 reason_2 1 王某 I21 J18 2 赵某 C34 I10 解码表测试数据:
code description I21 急性心肌梗死 J18 未特指病原体的肺炎 C34 肺恶性肿瘤 I10 原发性高血压 SQL执行后返回结果:
person_id name reason_1 reason_2 reason_1_desc reason_2_desc 1 王某 I21 J18 急性心肌梗死 未特指病原体的肺炎 2 赵某 C34 I10 肺恶性肿瘤 原发性高血压
内容的提问来源于stack exchange,提问作者Faz Naimov
相关产品推荐
相关产品推荐

