SQL查询如何展示外键关联的类型名称而非外键ID值
实现方法
你需要通过表关联把外键对应的字典表字段拉到查询结果里,不需要改动你现有写死的日历配色、筛选逻辑,只需要补2处修改即可:
- 从
REZERVACIJE表关联预订类型字典表,注意用左连接避免脏数据导致记录丢失 - 在
title字段拼接的位置,直接引用字典表的类型名称字段,同时修复你原SQL里多写的一个||拼接符语法错误
注:下面示例里假设你的预订类型字典表名为
REZ_TYPES,字典表主键字段为ID_REZ_TYPE,存储类型名称的字段为TYPE_NAME,你可以替换成自己实际的表名、字段名。
修改后的完整SQL如下:
select r.ID_REZ, /*预订ID,插入时自增*/ r.START_REZ, /*预订开始日期*/ r.END_REZ, /*预订结束日期*/ r.DETAILS_REZ, /*预订备注,VARCHAR2类型*/ case when r.DETAILS_REZ is not null then r.title || '[' || r.QUANTITY_REZ || 'x ' || t.TYPE_NAME || ' hours on ' || r.NUMBER_OF_HOURS || ' - ' || r.DETAILS_REZ || ' ]' end as title, r.QUANTITY_REZ, /*预订的物品/服务数量,数值类型*/ r.NUMBER_OF_HOURS, /*预订时长(小时),自动计算数值类型*/ case when r.REZ_TYPE_FK = 8 then 'apex-cal-red' when r.REZ_TYPE_FK = 9 then 'apex-cal-orange' when r.REZ_TYPE_FK = 10 then 'apex-cal-blue' when r.REZ_TYPE_FK = 11 then 'apex-cal-green' when r.REZ_TYPE_FK = 12 then 'apex-cal-lime' end as CSS_REZ /*日历条目配色样式字段*/ from REZERVACIJE r -- 左连接预订类型字典表,关联条件为外键对应字典表主键 left join REZ_TYPES t on r.REZ_TYPE_FK = t.ID_REZ_TYPE where (nvl(:REZ_TYPE_OBJ,'0') = '0' or r.REZ_TYPE_FK = :REZ_TTYPE_OBJ) /*LOV筛选预订类型逻辑保留*/ order by r.START_REZ
注意事项
- 表别名
r代表预订表、t代表类型字典表,加别名是为了写字段的时候更简洁,避免两个表有同名字段时报错 - 必须用
left join而不是inner join:如果存在外键为空、对应类型记录被删除的异常数据,inner join会把这些预订记录直接过滤掉,left join会保留预订记录,只是对应的类型名称显示为空,不会导致日历丢数据 - 你原有的配色逻辑、筛选逻辑、排序逻辑全部没有改动,不会影响现有功能运行
内容的提问来源于stack exchange,提问作者Fiki
相关产品推荐
相关产品推荐

