首页 > 解决方案 > 联接不存在公共字段并基于 ID 列的表

问题描述

这个问题似乎很难说,但是在解释了我的情况之后应该很容易理解。我有两个表:一个称为 INSTRUCTORS 保存讲师数据,另一个称为 LIST_OPTION_ITEM 保存存储在 INSTRUCTORS 表中的不同 ID 列的 ID 值。第三个可能很重要的表是 LIST_OPTION_TYPE,它包含 INSTRUCTORS 中任何 ID 列的 ID。也许通过显示示例数据和我想要的输出来解释会更容易。

讲师

RANK_ID SPECIALTY_ID DUTY_TITLE_ID SERVICE_BRANCH_ID STATUS_ID UNIT_ID OFFICE_SYMBOL_ID
1354 319 931 2604 1378 1406 1429

LIST_OPTION_ITEM

OPTION_ITEM_ID OPTION_TYPE_ID ITEM_VALUE
1354 22 CAPT
319 20 CBRN 创伤护士
931 21 IDMT-中队医疗元素
2604 128 46N 护士
1378 23 美国
1406 24 警卫
1429 126 CERFP

LIST_OPTION_TYPE

OPTION_TYPE_ID OPTION_TYPE
20 专业
21 职务_职称
22
23 服务_分公司
24 地位
126 单元
128 Office_Symbol

需要注意的是,我不能加入 INSTRUCTORS 和 LIST_OPTION_ITEM,因为没有公共列。但是,LIST_OPTION_ITEM 和 LIST_OPTION_TYPE 可以加入OPTION_TYPE_ID。我想要的SELECT查询输出:

专业 职称 服务分公司 地位 单元 办公室符号
CAPT CBRN 创伤护士 IDMT-中队医疗元素 46N 护士 美国 警卫 CERFP

我尝试了一些解决方案,但无法提出任何建议。我需要交叉连接还是什么?帮助将不胜感激。

标签: sqloracle

解决方案


我尝试使用 Pivot 和 unpivot 函数

下面是示例sql:

with inst as (select inst_id, col, col_id 
from (select rownum as inst_id, a.* from instructor a)
unpivot
(col_id for col in (status_id as 'STATUS',rank_id as 'RANK',specialty_id as 'SPECIALTY',duty_title_id as 'DUTY_TITLE')
))
select * from 
(select inst_id,col,item_value from inst,
(select a.option_type,b.option_item_id,b.item_value from LIST_OPTION_TYPE a, list_option_id b
where a.option_type_id = b.option_type_id) opt
where inst.col = upper(option_type)
and option_item_id = col_id)
pivot
(max(item_value)
for col in ('STATUS','RANK','SPECIALTY','DUTY_TITLE')
) order by inst_id;

这将提供所需的输出


推荐阅读