Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不存在公共字段且基于ID列的联接表_Sql_Oracle - Fatal编程技术网

Sql 不存在公共字段且基于ID列的联接表

Sql 不存在公共字段且基于ID列的联接表,sql,oracle,Sql,Oracle,这个问题似乎很难表达,但在解释了我的情况后,应该很容易理解。我有两个表:一个称为讲师,保存讲师数据;另一个称为列表选项,保存讲师表中存储的不同ID列的ID值。第三个可能也是很重要的表是LIST_OPTION_TYPE,它包含讲师中任何ID列的ID。也许通过显示示例数据和我想要的输出更容易解释 讲师 军衔 专业标识 职务、头衔、身份证 服务分支机构ID 身份证 单位识别号 办公室标识 1354 319 931 2604 1378 1406 1429 我尝试使用Pivot和unpivot函数 下面是

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

讲师

军衔 专业标识 职务、头衔、身份证 服务分支机构ID 身份证 单位识别号 办公室标识 1354 319 931 2604 1378 1406 1429
我尝试使用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;

这将提供所需的输出

它必须是SQL语句吗?数据模型对性能影响很大。从功能上讲,您可以拥有一个(大小适中的)PL/SQL块,它动态构建查询并返回一个
sys\u refcursor
。这将是一个痛苦的维护,但会比纯SQL解决方案好得多(我不是100%确定纯SQL解决方案是可能的)。如果您不关心来自
list\u option\u type
表的结果中的列名,您可以在查询中硬编码列名,这将大大简化问题。@我知道规范化和数据模型很差,但这正是我的工作场所所拥有和需要的。由于我希望在网页上显示数据(我正好使用ColdFusion),因此我确实希望在这种情况下使用SQL查询。ColdFusion不能调用返回
sys\u refcursor
的存储过程吗?管道表函数(取决于Oracle版本)怎么样?您对在结果中硬编码列名而不是使用
list\u option\u type
表中的值有何看法?这是一个选项吗?尽管我熟悉隐式和显式游标,但实际上我从未听说过
sys\u refcursor
。我也从未使用过流水线表函数,但根据我刚才查看的文档,这可能是一个很好的方法。硬编码不是一个选项,因为讲师表中大约有1000条记录。我可以开始尝试使用流水线表函数,但是如果你对此有一个好的答案,我会很感激。一个流水线表函数的例子,如果你使用18c,它会返回一个动态结果,使用多态表函数可以大大简化这一点。请注意,
instructors
中有多少行并不重要。硬编码是第一列将被称为
rank
,而不是通过查看
list\u option\u type
来获取列名。非常好!我喜欢将讲师表的ID基于行号的方式,这样它将返回相同数量的记录。这也是使用UNPIVOT和PIVOT的一个很好的实践。