2016-05-23 10 views
0

これらの名前を含む参照テーブルを使用して、1つのテーブルの列に名前を付けるのに苦労しています。私はそれが可能でなければならないと確信していますが、正しい解決策を見つけたり、それを達成するために正しい論理を考えることができません...Oracle PL/SQLは他のテーブルを使用して列名を設定します

状況:私は2つのテーブル、これらの列名を意味のある名前(参照表、または「コードブック」)に変換した名前が含まれています。

私は、2番目のテーブルの2番目の列に指定された列の名前で、最初のテーブルのデータを返す方法を探しています。

テーブルは次のようになります。

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

私は十分な言い訳をしていませんでした!問題と回答の両方をここで説明します: http://stackoverflow.com/questions/22309099/rename-columns-in-1-table-to-row-values-in-another-table – Dendrobates

答えて

1

何らかの値に基づいて列が可変であるクエリが必要なので、直接行うことはできません。あなたは何ができるか、わずかに異なる はあなたのクエリは、Oracleによって作成されたのは、動的SQLを構築している。

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> 

このようにしてrクエリを使用できますが、まだ可変列があるため、フェッチできません。

このコードを簡単に編集して、文字列を返すクエリを作成できます。文字列を連結して構成します。あなたはいつも一つのフィールドを持っていますが、それはあなたが尋ねたものとは違っています:

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 
関連する問題