2016-05-23 3 views
0

Я изо всех сил пытаюсь назвать столбцы в одной таблице, используя справочную таблицу, содержащую эти имена. Я уверен, что это должно быть возможно, но я не могу найти правильное решение или думать о правильной логике для его достижения ...Oracle PL/SQL устанавливает имена столбцов, используя другую таблицу

Ситуация: У меня есть две таблицы, одна с данными, столбцы с описательным имена и один с переводом этих имен столбцов на значимые имена (справочная таблица или «кодовая книга»).

Я ищу способ вернуть данные первой таблицы с именами столбцов, указанными во втором столбце второй таблицы.

Таблицы выглядеть следующим образом:

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-anothertable – Dendrobates

ответ

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. 

If вы копируете заявление и запускаете его:

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 
Смежные вопросы