我正在努力在一个表中命名列,使用包含这些名称的引用表。我确信它应该是可能的,但我似乎无法找到正确的解决方案或想出实现它的正确逻辑......
情况:我有2个表,一个包含数据,一个列具有描述性名称,另一个包含这些列名称到有意义名称的转换(参考表或#39;代码簿')。
我正在寻找一种方法来返回第一个表的数据,并在第二个表的第二列中给出列的名称。
表格如下:
dataTable:
q1,q2,q3
1,2,3
4,5,6
和
translationTable:
descName, meanName
q1, meaning1
q2, meaning2
q3, meaning3
结果应该是:
meaning1,meaning2,meaning3
1,2,3
4,5,6
帮助将受到高度赞赏!
答案 0 :(得分:1)
您无法直接执行此操作,因为您需要基于某个值的列可变的查询。 稍有不同,您可以做的是构建一个动态SQL以使您的查询由Oracle创建:
SETUP:
SQL> create table dataTable(q1,q2,q3) as
2 select 1,2,3 from dual union all
3 select 4,5,6 from dual
4 ;
Table created.
SQL> create table translationTable(descName, meanName) as
2 select 'q1', 'meaning1' from dual union all
3 select 'q2', 'meaning2' from dual union all
4 select 'q3', 'meaning3' from dual ;
Table created.
这将创建并打印您的查询:
SQL> declare
2 vSQL varchar2(1000);
3 begin
4 select listagg (column_name || ' AS "' || meanName || '"', ', ') within group (order by column_name)
5 into vSQL
6 from user_tab_columns col
7 inner join translationTable tr
8 on (upper(tr.descName) = col.column_name)
9 where table_name = upper('dataTable');
10 --
11 vSQL := 'select ' || vSQL || ' from dataTable';
12 dbms_output.put_line(vSQL);
13 end;
14 /
select Q1 AS "meaning1", Q2 AS "meaning2", Q3 AS "meaning3" from dataTable
PL/SQL procedure successfully completed.
如果您复制语句并运行它:
SQL> select Q1 AS "meaning1", Q2 AS "meaning2", Q3 AS "meaning3" from dataTable;
meaning1 meaning2 meaning3
---------- ---------- ----------
1 2 3
4 5 6
SQL>
通过这种方式,您可以查询,但无法获取查询,因为它仍然具有可变列。
您可以轻松编辑此代码,使其构建一个返回字符串的查询,通过连接这些字符串组成;通过这种方式,您将始终拥有一个字段,但它与您提出的要求不同:
SQL> select 'meaning1, meaning2, meaning3' from dual
2 union all
3 select Q1 || ',' || Q2 || ',' || Q3 from dataTable;
'MEANING1,MEANING2,MEANING3'
--------------------------------------------------------------------------------
meaning1, meaning2, meaning3
1,2,3
4,5,6